0

在这个简单的例子中,为什么做newObject.create表现不同?

var test=function(name){
    this.name=name
};
var test1= new test("AAA");
test1.name;//AAA

var test2=Object.create(test);
test2.name="AAA";
typeof(test2);//Object
test2.name;//"" (empty string).

为什么是test2.name空的?

4

2 回答 2

3

Object.create期望Object作为原型链的第一个参数,而不是函数(或您的情况下的构造函数)。

如果你传递一个函数它不会抱怨,但这意味着某些额外的东西将被你创建的Object继承,例如,函数名的不可写性。

你得到一个空字符串的原因是因为test它是一个匿名函数,test.name所以"". 正如我上面所说,这是不可写的,所以

test.name = 'foo';
test.name; // still ""

如果您对 使用命名函数表达式test这将更加明显。

var test = function foobar() {},
    ex = Object.create(test);
ex.name; // "foobar"

编辑一个行为类似于usingnew的函数看起来像这样testObject.create

function myNew() {
    var o = Object.create(test.prototype); // set up prototype inheritance
    test.apply(o, arguments);              // then construct
    return o;
}
// and using it
var test3 = myNew('AAA');
test3.name; // "AAA"
test3.name = 'BBB';
test3.name; // "BBB"

不保证此模式适用于 DOM 构造函数。

于 2013-06-21T23:32:12.187 回答
0

“名称”一词在 JavaScript 中“几乎是保留的”。如果您尝试使用普通的属性名称,它应该可以工作。例如,

var test=function(name){this.name=name};
var test1= new test("AAA");
test1.name;//AAA
var test2=Object.create(test);
test2.name2="AAA";
typeof(test2);//Object
console.log(test2.name2);//"AAA"

对于两种创建对象的方式之间的区别,此页面显示了一些示例和解释。

于 2013-06-21T23:57:05.000 回答