在这个简单的示例中,为什么new
和Object.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
为空?
答案 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显示了一些带有解释的示例。