主页 > 专题教程 > javascript > js基础 >
来源:自学PHP网 时间:2018-02-08 10:24 作者: 阅读:次
[导读] 由于基于原型链实现继承的方式存在一些缺点,所以人们采用了另外一种方式来实现继承——基于函数伪造的方式实现继承。这个技术的思想是在子类构造函数的内部调用父类的构造函...
由于的方式存在一些缺点,所以人们采用了另外一种方式来实现继承——基于函数伪造的方式实现继承。这个技术的思想是在子类构造函数的内部调用父类的构造函数。 因为在JavaScript中,函数是在特定环境中执行代码的对象,所以我们可以使用 /* 创建父类 */ function Parent(){ this.color = ["red","blue"]; } /* 创建子类 */ function Child(){ // 继承父类的属性 Parent.call(this); } 在上面的代码中,我们首先创建了一个父类 在一文中,我们已经介绍了 我们可以通过下面的方法来进行验证: var c1 = new Child(); //创建子类对象c1 c1.color.push("Green"); //为c1添加新的颜色 console.info(c1.color); //控制台输出:red,blue,Green var c2 = new Child(); //创建子类对象c2 console.info(c2.color); //控制台输出:red,blue 在上面的代码中,我们创建了子类对象c1,并为它添加新的颜色”Green“,所以会在控制台中输出:"red,blue,Green"。然后我们又创建了对象c2,因为没有为它添加新的颜色,所以它只会在控制台中输出继承自父类的颜色:"red,blue"。 每调用一次 原型链继承的另外一个缺点是无法从子类中调用父类的构造函数,这样就没有办法把子类中的属性赋值到父类中。通过函数伪造的方式可以很好的解决这个问题。来看下面的例子: // 创建父类 function Parent(name){ this.name = name; } //创建子类 function Student(name,age){ //使用伪造的方式就可以把子类的构造函数参数传递到父类中 Parent.call(this,name); //调用父类的属性 this.age = age; } var s1 = new Student("Leon",22); var s2 = new Student("Ada",25); console.info(s1.name + "," + s1.age); // 控制台输出:Leon,22 console.info(s2.name + "," + s2.age); // 控制台输出:Ada,25 在上面的代码中,子类Student通过函数伪造的方式调用父类的 在上面的讨论中,我们讲的只是子类继承父类的属性,那么子类如何继承父类的方法呢?在前面我们说过,通常我们将方法放到原型中设置,例如父类中有一个 // 创建父类 function Parent(name){ this.name = name; } // 父类的say()方法 Parent.prototype.say = function(){ console.info(this.name); } //创建子类 function Student(name,age){ Parent.call(this,name); this.age = age; } 由于使用函数伪造的方式不会完成子类Student的原型指向父类Parent,所以在子类继承父类之后, // 创建父类 function Parent(name){ this.name = name; // 父类的say()方法 this.say = function(){ console.info(this.name); } } //创建子类 function Student(name,age){ Parent.call(this,name); this.age = age; } 这样做虽然可以使子类继承父类的 由于基于函数伪造的方式实现继承也存在缺陷,所以我们也不会单独使用这种方式来完成继承,而是会使用基于组合的方式实现继承,我们将在下一篇文章中介绍这种继承方式。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com