自从我的童年时代起,我已经阅读并遵循了我应该在原型继承的情况下覆盖构造函数。但令我惊讶的是,即使重写了重写构造函数语句,下面的示例也会在控制台上输出相同的内容。请指教。
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");
答案 0 :(得分:2)
在进入构造函数部分之前,代码中存在问题。通过执行
,您同时使B.prototype
和A.prototype
相同
B.prototype = A.prototype;
这意味着,您无法有效地识别由这些函数构造的对象的父级。试试这个
console.log(new B() instanceof A, new B() instanceof B);
// true true
这是预期的,因为B
由B
创建,而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
原型链中的任何位置。由于B
与B.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
函数对象替换它的原因。