js 原型继承 以及 constructor 问题
function A(){}
A.prototype = {
aa : function(){
console.log(1)
}
}
function B(){ }
B.prototype = {
bb : function(){
console.log(2)
}
}
B.prototype = new A();
var b = new B();
B.prototype.constructor = B; // 不加这个的时候 b指向的object 报错说object 没有bb这个方法,加上这话以后 我让他指向B 但是无效 还是报下面的错误
b.aa();
b.bb(); //报错 没有这个方法
请问两个问题
1 b.bb(); 这个为什么不能访问 怎么才能访问 ,自己的实列 虽然prototype指向了A ,但是我用constructor 指回自己的时候 还是不能访问啊
2 B.prototype.constructor = B; 这句话怎么用?在哪用才有效
------解决方案--------------------1.实例b之所以不能调用bb方法,是因为B的原型对象已经被重写(引用A的原型对象{aa:function(){...}}),B和原来的原型对象{bb:function(){...}}之间的联系被切断,两者已经没有关系。
至于constructor属性,它只是原型对象中的一个属性而已,和b能不能调用bb没有关系。可以理解为:b原来的原型对象为:{constructor:B, bb:function(){...}},而后又变成了{constructor:A, aa:function(){...}},
最终在你把constructor改变后变成了: {constructor:B, aa:function(){...}}。虽然constructor变了回来,但是原型对象里的方法还是aa。所以实例化后的b只能调用aa,不能调用bb。
2.constructor的本意是在指明一个实例所属的类(构造函数),但是因为该属性可以被随意改变,就像你上面的操作一样(B.prototype.constructor = B),所以实际上,该属性在一般情况下并没有多大用处(个人理解,仅供参考)。