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, 这个关系到引用的问题 , 这里不作展开 ,具体请看。

 

posted @ 2016-04-15 13:58  JDDDD  阅读(328)  评论(0编辑  收藏  举报