原型继承没有按预期工作

时间:2015-03-17 07:04:15

标签: javascript constructor prototype

自从我的童年时代起,我已经阅读并遵循了我应该在原型继承的情况下覆盖构造函数。但令我惊讶的是,即使重写了重写构造函数语句,下面的示例也会在控制台上输出相同的内容。请指教。

function A() {
    console.info("A constructor");
}

function B() {
    console.info("B constructor");
}

B.prototype = A.prototype;
B.prototype.constructor = B; // Do we really need this statement?

console.info("cp 1");
var b = new B();
console.info("cp 2");

1 个答案:

答案 0 :(得分:2)

在进入构造函数部分之前,代码中存在问题。通过执行

,您同时使B.prototypeA.prototype相同
B.prototype = A.prototype;

这意味着,您无法有效地识别由这些函数构造的对象的父级。试试这个

console.log(new B() instanceof A, new B() instanceof B);
// true true

这是预期的,因为BB创建,而B是由A的原型创建的。但

console.log(new A() instanceof A, new A() instanceof B);
// true true

Whaaat?为什么A的对象是B的实例?因为,因为您使B.prototype也与A.prototype相同,所以当对象A试图找出其原型(A.prototype是否是从{创建的对象的原型时{1}})存在A原型链中的任何位置。由于BB.prototype相同,因此A.prototype的对象可以被视为A的对象。

正确的方法是,

B

现在,您正在使用B.prototype = Object.create(A.prototype); 原型创建一个B原型对象。因此,它不是A'原型,而是基于A原型创建的对象。


现在,如果我们不做什么

A

尝试打印由B.prototype.constructor = B; 创建的对象的constructor属性,不包含该行

B

由于console.log((new B()).constructor); // [Function: A] 的原型仍然具有从B' s A复制的构造函数值,因此它仍然引用函数prototype。这就是我们用A函数对象替换它的原因。