7

我正在通过执行以下操作来创建 javascript 对象:

function field(name,label){
        this.name = name
        this.label= label;
}

var a = new field("market","Mkt").

然后我将 a 分配给另一个对象。

object.newField = a;

第二种方法是直接创建一个新属性

object.2ndNewField = {
    name: "market2",
    label:"Mkt2"
}

我尝试在其他函数中读取对象。它们的行为不同,但是,当我对对象进行字符串化时,它看起来还不错。我创建的两个属性有什么区别?

顺便说一句,以下对象有什么区别吗?

 object.2ndNewField = {
        "name": "market2",
        "label":"Mkt2
    }
4

2 回答 2

6

不同的是,在第一种情况下,创建的对象继承自field.prototype然后Object.prototype(即其内部 [[Prototype]] 是 field.prototype,其内部 [[Prototype]] 是Object.prototype),其中在第二种情况下,它仅继承自Object.prototype

另一种看待它的方式是:

object.newField instanceof field; // true
object.newField instanceof Object; // true

object.newField2 instanceof field; // false
object.newField2 instanceof Object; // true

或者继承链是:

object.newField  -> field.prototype -> Object.prototype -> null

object.newField2 -> Object.prototype -> null

其中 '->' 表示“继承自”。

于 2011-07-12T01:41:50.690 回答
1

对于第一个选项...远离使用“新”。如果“new”被错误地使用,或者在应该使用时被省略,你可能会严重影响你的全局命名空间。另外,您必须小心在代码中的某些地方使用“this”,因为它可能会绑定到您认为不是的东西,甚至是您的全局数据。

在您提供的第二个选项中,您可以安全地将其用于仅用作数据/方法集合的对象(即不是“类类”行为)。如果您想要一些可以使用私有和公共变量/方法创建多个实例并且可以继承的东西,那么您应该使用一个返回对象的函数。

我在这里写了一篇关于如何安全地创建基础对象和使用继承的文章和示例。如果你点击链接,你会明白为什么我没有在这篇文章中重新输入;)。

希望这可以帮助...

于 2011-07-12T02:48:15.917 回答