编程语言
首页 > 编程语言> > javascript中实现继承的方式

javascript中实现继承的方式

作者:互联网

js中的继承

  js中的继承和java中的继承不一样,js中的继承主要是通过对父类进行复制来实现的。今天刷题的时候想起来这个问题,之前看了一遍,还是没有记很清楚,所以我就查阅了资料外加网上搜索,总结了几条,那么到底该怎样实现呢,今天就来谈谈。
  首先,一个公共的父类,代码如下:

//公共父类
function People(name,age){
    this.name = name;
    this.age = age;
    this.friends=['lili','candy','tom'];
    //内部方法
    this.sayAge = function(){  
        console.log('i am '+this.age+' years old now');
    }
}
//原型方法
People.prototype.sayName = function(){
   console.log(this.name+' 现在 '+this.age+' 岁!');
}

1、原型继承
  这种方式是大家很容易就能想到的,几乎是脱口而出。主要实现方法是:将子类的原型作为父类的实例(Child1.prototype = new People())

//子类
function Child1(){

} 
Child1.prototype = new People();  //核心
Child1.prototype.name = 'tyj';
Child1.prototype.age = 20;
var child1 = new Child1();

console.log(child1.name);       
console.log(child1.friends);     //['lili','candy','tom']  
child1.sayName();

原型继承的缺点:
  1)引用类型值的原型属性会被所有实例共享
  2)不能向父类传递参数

基于第一个缺点举个栗子:

var child2 = new Child1();
child2.friends.push('lucy');
console.log(child2.friends);    //['lili','candy','tom','lucy']
console.log(child1.friends)    //['lili','candy','tom','lucy']

基于第二个缺点举个栗子:

function Child1(name){
} 
var child2 = new Child1("一马平川");
var child22 = new Child1("顺顺利利");
child2 .sayName();        //undefined现在undefined岁!
child22 .sayName();      //undefined现在undefined岁!
//如果想设置参数,可以在Child1的原型上添加

2、构造函数继承
  使用构造函数实现继承,主要是借用了call()和apply()方法来实现

//子类
function Child2(name){
    People.call(this);    //调用父类,继承People
    this.name = name || 'Jack';
    this.age = age || 15;
}
var child2 = new Child2();
console.log(child2.name);
child2.sayAge();    //父类内部方法,可以调用
child2.sayName();  //父类原型上方法,调用时报错

构造函数继承的缺点:
  1)不能调用父类的原型方法,只能是内部方法
  2)每个子类都有父类实例函数的副本,影响性能

3、组合继承
  这种方式是将原型继承和构造函数继承的方式组合在一起,原型链实现对原型属性和方法的继承,构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。这也是 JavaScript 最常用的继承模式

//子类
function Children(){
    People.call(this,'candy',20);
}
Children.prototype = new People();
var child3 = new Children();
console.log(child3 .name);
child3 .sayName();   //原型上定义的方法

4、寄生组合式继承

function Child4(name,age){
    People.call(this);
    this.name = name;
    this.age = age;
}
// 创建只继承原型对象的函数
function init(parent,child){     //参数:父类型构造函数和子类型构造函数。
    var prototypes = new Object(parent.prototype);   // 创建一个原型对象副本
    prototypes.constructor = child;    // 设置constructor属性,重写原型而失去的默认的 constructor 属性
    child.prototype = prototypes;
}
init(People,Child4);

var child4= new Child4('heihei',18);
console.log(child4.name);

标签:Child1,name,方式,继承,age,javascript,原型,new
来源: https://blog.csdn.net/tang422622/article/details/88034928