不涉及私有“函数”的“Object.create”的自定义实现

Custom implementation of `Object.create` not involving private `function`

本文关键字:Object create 实现 自定义 函数      更新时间:2024-07-03

根据包括规范在内的各种来源,如果要创建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是读写的,并且可以更改。

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

您的第二个函数与第一个函数不等价。设置一个简单对象的"prototype"属性没有任何效果。更好的测试:

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

构造函数函数的"prototype"属性很有趣,因为它实际上在为构造的对象建立继承链方面发挥了作用。