Object.create如何在Javascript中防止多重继承?

3

MDN在这里解释了JavaScript中的继承(注释显示原型链):

var a = {a: 1}; 
// a ---> Object.prototype ---> null

var b = Object.create(a);
// b ---> a ---> Object.prototype ---> null
console.log(b.a); // 1 (inherited)

var c = Object.create(b);
// c ---> b ---> a ---> Object.prototype ---> null

var d = Object.create(null);
// d ---> null
console.log(d.hasOwnProperty); 
// undefined, because d doesn't inherit from Object.prototype

在这里,我觉得c继承了多个类。那么这为什么不算多重继承呢?

2个回答

8

多重继承是指父类在继承层次结构中处于同一级别:

c ---> b ---> Object.prototype ---> null
 \---> a ---> Object.prototype ---> null

在这种情况下,它是从一个类b继承,该类又继承自另一个类a:

c ---> b ---> a ---> Object.prototype ---> null

补充说明:虽然效果看起来相似(通过原型链查找,b的属性也将“出现”在c中),但需要注意的是多重继承将允许ab具有完全不同的继承链(实际上是继承“树”),而这显然不是在你的示例中的情况。


1
感谢您的编辑,@zerkms。我正准备自己添加类似的内容。 - doldt
希望我的 ASCII 艺术不会太丑 :-) - zerkms
我看明白了。那么为了完全清楚,在这个问题的例子中,该对象继承自链条中更高层次的其他对象,而不是在同一级别上继承吗? - Startec
@Startec - 对不起,我不确定我是否理解了 - 那个链是单一继承链,根据定义,没有来自外部的继承,也没有处于同一级别的元素,因为它是一条一对一的链。 - doldt

1
多重继承意味着同时从两个或更多的类中继承,即具有两个或更多的直接祖先。它们形成一棵树。
在您的情况下,只有一个直接祖先:b,而a是b的直接祖先,但是c的间接祖先。它们形成一个线性链。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接