如何在 JavaScript 中从原型创建对象

How to create an object from a prototype in JavaScript?

本文关键字:原型 创建对象 JavaScript      更新时间:2023-09-26

我是 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)那样工作?

create中,您正在借助构造函数(new F())创建一个新对象。因此,在对象和用构造函数构造的对象之间建立了原型链proto

create2 中,您将创建一个对象并在其上创建一个名为 prototype 的属性。在这种情况下,原型链没有建立。

这就是为什么create2创建的对象无法沿着原型链向上找到status的原因。

注意:在第二种情况下,您仍然可以执行

document.writeln(c2.prototype.status);

在create2方法中,如果您需要标准原型而不是标准"原型"。如果你想让它工作,你需要使用Object.setPrototypeOf(o, proto)新创建的属性"原型"将是具有符号链接到父对象。

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);