`Object.create`的自定义实现不涉及私有`function`

时间:2013-12-11 15:13:27

标签: javascript

根据各种来源,包括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是读写的,可以更改。

这个假设答案的问题是我无法在规范中对其进行验证。

1 个答案:

答案 0 :(得分:1)

你的第二个功能与第一个功能不同。设置简单对象的“prototype”属性没有任何效果。一个更好的测试:

 var x = Object.mycreate2({foo: "bar"});
 console.log(x.foo); // undefined

构造函数函数的“prototype”属性很有意思,因为它确实在为构造对象建立继承链方面起作用。