如何在JavaScript中创建一个新对象?

6
为什么这个不起作用?
    var sheep = function(options){
        this.options = {sizes: 100,
                        eat: 100,
                 colors: 'white', 
                 running: function () {
                     return this.sizes + this.eat;
                 }
          }
    };

    var blacksheep = new sheep({colors:'black'});       

    alert('blackcsheep color is ' + blacksheep.colors);//error undefined
    alert('blackcsheep color is ' + blacksheep.options.colors);// it return white
    alert('blackcsheep running is ' + blacksheep.running());//error

1
sheep已经是一个对象了。我认为阅读有关JavaScript基础知识的内容会对您最有帮助:MDN JavaScript指南,特别是使用对象 - Felix Kling
3
"blacksheep = sheep" 不会创建 sheep 的副本,这两个变量只是引用同一个对象。这与原型继承无关。 - Felix Kling
虽然考虑与原型无关:如果您对对象进行深拷贝,然后修改副本,则实际上已经将原始对象用作原型;也许这在js中不是典范,但这就是原型的概念。 - ShinTakezou
@FelixKling 你在和我说话吗?我没有改变“代码”,只是添加了(这不是在js中实现的真正方法,只是一个想法);如果你看到了不同的东西,那只是你的观点。 - ShinTakezou
@ShinTakezou:不,我是在回应楼主……他们又改了代码 :-/ - Felix Kling
显示剩余8条评论
7个回答

3
语法如下:
var sheep = {sizes:100, eat:100, colors:'white',running:function(){
        return this.sizes+this.eat;
        }
    };

这是一个对象字面量。它定义了一个对象的实例,但不是定义它的类。因此,没有办法“new-up”另一个对象实例。

看一下jQuery的extend功能:

var blacksheep = {
}

$.extend(blacksheep, sheep, { color: black });

这将复制sheep的所有属性到blacksheep中,然后将第三个参数合并到blacksheep中,从而有效地实现您想要的结果。


$.extend 对我来说只是方便而已,好的,我接受这个答案。 - FatDogMark

1

在基于羊的情况下创建另一个黑色羊,您可以这样做(使用jQuery):

var blacksheep = $.extend(sheep, { color: 'black' });

如果没有jQuery,我不会这样做。克隆对象很麻烦-应该使用一个名为function Sheep() {...}的示例。有关JavaScript对象克隆的信息,请参见https://dev59.com/A3RB5IYBdhLWcg3wET5J。 - Richard Rout

1
您可以像这样创建一个sheep对象。
 function Sheep(sizes,eat,colors){
    this.sizes = sizes;
    this.eat = eat;
    this.colors = colors;
    this.running = function (){
     return this.sizes+this.eat;
    }

    }

或者你也可以这样写

 function Sheep(sizes,eat,colors){
    this.sizes = sizes;
    this.eat = eat;
    this.colors = colors;        
    }
 sheep.prototype.running = function(){
 return this.sizes + this.eat;    
}

var sheep1 = new Sheep('100','100','白色');


1
var sheep = function(){
    this.sizes = 100;
    this.eat = 100;
    this.colors = 'white';
    this.running = function(){
        return this.sizers + this.eat;
    }
}

为什么我需要在所有变量中使用'this'...我不能只是将我的sheep对象包装在一个函数中并将其转换为类吗? - FatDogMark
var a = new sheep(); 现在a有属性sizes...因为使用了'this' - karaxuna
'this' 是当前的 sheep 类。在这里阅读它的含义:http://www.quirksmode.org/js/this.html - karaxuna

1
在 JavaScript 中,你不像强类型语言那样声明对象。你需要使用类似下面这样的函数来声明对象:
function sheep() {
    this.color = "white";
    this.size = 200;
    this.speed = 100;
    this.running = function () {
        return "the sheep is running!";
    };
}

var blacksheep = new sheep();

alert('sheep size is ' + blacksheep.size);
alert('sheep running is ' + blacksheep.running());​

你的新对象不起作用是因为你正在创建一个带有名为options的子对象的新对象。options包含了你所有的方法。因此,只有你提供的这三行代码中的第二行才会给出正确的响应:

alert('blackcsheep color is ' + blacksheep.colors);
alert('blackcsheep color is ' + blacksheep.options.colors); // Only this one correctly references `options`.
alert('blackcsheep running is ' + blacksheep.running());

我看到有些人创建类时不需要使用this,而是使用this.options{...},然后他可以像这样创建新对象:blacksheep = new sheep({colors:'black',sizes=10}); ,如何实现这个? - FatDogMark
我的第一个示例展示了如何做到这一点。当您调用函数new sheep()时,this指的是正在创建的新对象。var blacksheep = new sheep()所做的是将sheep()函数中由this引用的所有属性应用于变量blacksheep。因此,您可以继续像我一样引用blacksheep.sizeblacksheep.running()等内容。在这里尝试一下:http://jsfiddle.net/SZQVn/ - Levi Botelho

0

在你的情况下,sheep已经是一个对象,你不能创建一个对象的对象。 你可以直接使用该对象的属性。

但我认为你想要这样的东西

var sheep = {sizes:100, eat:100, colors:'white', running:function(){ return this.sizes+this.eat; } }; Object.defineProperty(sheep, 'colors', { value: 'black' , writable: true });

谢谢


-1

Javascript是基于原型而不是类的。它不使用类,而是面向对象的。

var whitesheep =new sheep("100","100","white","running");
var blacksheep =new sheep("100","100","black","running");

1
你在浏览器控制台试过这个吗?除非你定义一个函数对象并返回一些具有其属性作为传递值的对象,否则它将无法工作。 - Alok Swain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接