如何从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

我是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 = { }, 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)