我是JavaScript的新手,目前正在阅读这本书" JavaScript:The Good Parts"。我想了解以下内容:
function create(proto) {
var F = function() { };
F.prototype = proto;
return new F();
}
function create2(proto) {
var o = { };
o.prototype = proto;
return o;
}
var o = { }, c1 = create(o), c2 = create2(o);
o.status = 'OK';
document.writeln(c1.status);
document.writeln(c2.status);
create(proto)
是如何在书中完成的。
create2(proto)
是我认为应该如何运作的。
显然,本书的例子是有效的,而我的不是,所以输出是:
OK
undefined
现在我的问题是:为什么create2(proto)
不能像create(proto)
那样工作?
答案 0 :(得分:4)
在create
中,您将在构造函数(new F()
)的帮助下创建一个新对象。因此,在proto
对象和使用构造函数构造的对象之间建立原型链。
在create2
中,您正在创建一个Object并在其上创建一个名为prototype
的属性。在这种情况下,原型链没有建立。
这就是create2
创建的对象无法通过原型链查找status
的原因。
注意:在第二种情况下,您仍然可以
document.writeln(c2.prototype.status);
答案 1 :(得分:1)
在create2方法中,如果您需要的标准原型不是标准的“原型”。如果你希望这个工作,你需要使用Object.setPrototypeOf(o, proto)
新创建的属性“prototype”将是具有符号链接的卫星对象
父对象。
function create(proto) {
var F = function() { };
F.prototype = proto;
return new F();
}
function create2(proto) {
var o = { };
Object.setPrototypeOf(o, proto);
return o;
}
var o = { }, c1 = create(o), c2 = create2(o);
o.status = 'OK';
console.log(c1.status);
console.log(c2.status);