不涉及私有“函数”的“Object.create”的自定义实现
Custom implementation of `Object.create` not involving private `function`
根据包括规范在内的各种来源,如果要创建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"属性很有趣,因为它实际上在为构造的对象建立继承链方面发挥了作用。
相关文章:
- 使用Object.create()的角度服务继承
- 在使用object.create创建的对象中使用super
- 正在使用object.create()创建XMLHttpRequest对象
- Object.create()只读名称属性
- childObj.prototype = Object.create(parentObj.prototype) 和 ch
- object.create 不使用我的新值
- Object.create() instead of prototype
- Object.create and Prototypes
- Javascript Object.create
- 使用Object.create作为原型的原型继承将[Object]作为实例的原型
- 不涉及私有“函数”的“Object.create”的自定义实现
- 正在对通过object.create创建的对象设置原型
- javascript中的Object.create方法
- 重写JavaScript中的Object.create方法
- 在不使用object.Create的情况下创建具有null原型的javascript对象
- JavaScript inheritance Object.create
- 为什么MDN Object.create polyfill上的Temp.prototype设置为null
- 使用Object.create()创建对象的模式
- 使用“new”关键字创建的对象和使用“Object.create”创建的对象给出不同的结果
- Object.create Prototype Chains