根据各种来源,包括specs,如果要创建更简单版本的Object.create
的自定义实现,那么它将是这样的:
if (typeof Object.mycreate1 !== 'function') {
Object.mycreate1 = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
但是,由于new
基本上会创建一个新实例并在其上调用F
,我想知道这是否也是正确的:
if (typeof Object.mycreate2 !== 'function') {
Object.mycreate2 = function( o ) {
var _ = { };
_.prototype = o;
return _;
}
}
简单测试表明这有效:
var p = { name : 'Jan', surname : 'Kowalski' };
var q = Object.mycreate2( p );
q.surname = 'Malinowski';
p.surname = 'Kowalski';
console.log( q.surname );
console.log( p.surname );
问题是:后一种实施是否正确?如果不是,我也想知道原因。
我可能可能知道答案:对象的prototype
属性是只读的,当它在FireFox中有效时,它不应该。另一方面,函数prototype
是读写的,可以更改。
这个假设答案的问题是我无法在规范中对其进行验证。
答案 0 :(得分:1)
你的第二个功能与第一个功能不同。设置简单对象的“prototype”属性没有任何效果。一个更好的测试:
var x = Object.mycreate2({foo: "bar"});
console.log(x.foo); // undefined
构造函数函数的“prototype”属性很有意思,因为它确实在为构造对象建立继承链方面起作用。