为什么new和object.create在此示例中的行为有所不同

时间:2013-06-21 23:11:10

标签: javascript function object methods

在这个简单的示例中,为什么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为空?

2 个答案:

答案 0 :(得分: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"

编辑使用new的{​​{1}}行为类似于test的函数将如下所示

Object.create

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

答案 1 :(得分:0)

“name”这个词在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"

对于创建对象的两种方式之间的差异,this page显示了一些带有解释的示例。