日期:2014-05-16  浏览次数:20328 次

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; 这句话怎么用?在哪用才有效
JavaScript Prototype 继承 原型

------解决方案--------------------
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),所以实际上,该属性在一般情况下并没有多大用处(个人理解,仅供参考)。