JS面向对象(二)——构造函数的继承
构造函数的封装请移步 http://www.cnblogs.com/JDDDD/p/5392231.html
对象之间继承一共有五种方法
比如现在有一个Person的构造函数,有两个属性name和sex,有两个方法showName()和showSex()
1 function Person(name , sex) { 2 this.name = name; 3 this.sex = sex; 4 } 5 Person.prototype.showName = function () { 6 alert(this.name); 7 }; 8 Person.prototype.showSex = function () { 9 alert(this.sex); 10 };
现在又有一个Worker的构造函数,有一个属性
1 function Worker(name , sex , job) { 2 3 //this--->new出来的worker对象 4 this.job = job; 5 }
现在需要让Worker去继承Person
方法一 构造函数绑定
使用call或者apply方法(可以将一个对象替换成当前对象,这边即将Person对象替换成当前的Worker对象),将父对象的构造函数绑定在子对象上
1 //------>工人的继承 2 function Worker(name , sex , job) { 3 // Person.apply(this ,[name,sex]); 4 Person.call(this,name,sex); 5 this.job = job; 6 } 7 8 var oW = new Worker('jiang','male','boss'); 9 alert(oW.name); 10 oW.showName();
这时我们会发现第一个alert是可以输出的,而第二个oW.showName()却无法调用 , 控制台会提示oW.showName() is not a function 这是因为我们没有复制父级的原型 改进如下
1 //------>工人的继承 2 function Worker(name , sex , job) { 3 Person.apply(this ,[name,sex]); 4 this.job = job; 5 } 6 7 for(var i in Person.prototype){ 8 Worker.prototype[i] = Person.prototype[i]; 9 } 10 11 var oW = new Worker('jiang','male','boss'); 12 alert(oW.name); 13 oW.showName();
这时oW.showName()就可以输出内容 jiang,当然这边不能直接使用Worker.prototype = Person.prototype 因为这样的话子对象的prototype的改变将会影响到父级的prototype, 这个关系到引用的问题 , 这里不作展开 ,具体请看。