如何从JavaScript中的原型创建对象?
我是JavaScript新手,目前正在阅读《JavaScript:好的部分》一书。我试图理解以下内容:如何从JavaScript中的原型创建对象?,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我是JavaScript新手,目前正在阅读《JavaScript:好的部分》一书。我试图理解以下内容: function create(proto) { var F = function() { }; F.prototype = proto; return new F(); } function create2(proto) { var o = { }; o.prototype = proto; return o; } var o = { }, c
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)
那样工作?在create
中,您是在构造函数(new F()
)的帮助下创建一个新对象的。因此,在proto
对象和使用构造函数构造的对象之间建立原型链
在create2
中,您正在创建一个对象,并在其上创建一个名为prototype
的属性。在这种情况下,未建立原型链
这就是为什么create2
创建的对象无法沿着原型链查找状态的原因
注意:在第二种情况下,您仍然可以这样做
document.writeln(c2.prototype.status);
在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);
这是因为var o={};是对象文字而不是函数-F
是函数,而o
不是函数。感谢您的编辑。仅供参考:这在Chrome和Firefox中可以正常工作,但在Safari中不行,而且我的IDE(IntelliJ IDEA Ultimate)也不能识别对象。setPrototypeOf(o,proto)
。