我想知道以下几个方面的区别:
childObj.prototype = Object.create(parentObj.prototype)和
childObj.prototype = parentObj.prototype;因为它们都是,所以我需要在子对象中调用父构造函数才能访问构造函数属性。
我知道Object.create函数是如何工作的,而且我注意到区别仅仅是因为它返回了一个新对象,其中包含了带有父原型的对象。我想我不理解的是返回带有父原型的新对象的效果。
发布于 2016-04-26 16:05:46
第一个示例是正确的方法,因为它创建了一个以parentObj.prototype作为其[[Prototype]]的新对象。
childObj.prototype = Object.create(parentObj.prototype); // { __proto__: parentObj.prototype }第二个只是将childObj.prototype设置为与parentObj.prototype相同的对象。这就造成了一些问题:
function parentObj() {
}
parentObj.prototype.parentFn = function() { console.log('parent'); };
function childObj() {
}
childObj.prototype = parentObj.prototype;
// here we are writing onto parentObj.prototype as well!!!
childObj.prototype.childFn = function() { console.log('child'); };
var child = new childObj();
var parent = new childObj();
child.parentFn(); // 'parent'
parent.childFn(); // 'child' --- this should not happen!!!在直接分配对象时,我们已经将其写入父.prototype。
发布于 2016-04-26 16:01:19
基本上,Object.create的第一个参数是原型,第二个参数是属性描述符对象。因此,当您将原型对象单独传递给Object.create时,将创建一个没有任何自身属性的对象,并将传递的对象分配给新创建的对象的__proto__。
var x = {a:10};
var y = Object.create(x);
console.log(y); //{__proto__:{a:10}}但是当您将父母的原型分配给孩子的时候,简单地说,引用是重叠的。这个目标不会发生任何结构上的变化。
发布于 2016-04-26 16:20:08
我能想到的一个不同之处是:
假设你有
c = new childObj()
p = new parentObj()在这两种情况下
c instanceof parentObj === true但在第二种情况下
p instanceof childObj === true但在第一种情况下
p instanceof childObj === falsehttps://stackoverflow.com/questions/36870003
复制相似问题