ylinwind.

JavaScript 继承!!!

字数统计: 364阅读时长: 1 min
2019/03/07 Share

JavaSctipt 继承

首先我们知道JavaScript是没有继承的概念的,类似于其他的面向对象的语言Java,C++等;没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式来实现继承。下面就记录下常见的继承方式和他们的优缺点。

Super code

function Person(name,age,sex){
    this.name = name || 'name';
    this.age = age || 0;
    this.sex = sex || 'male';
    this.laugh = function(){
        console.log(this.name,'在对象内大笑~');
    }
}
Person.prototype.protoLaugh = function()
{
    console.log(this.name,'在原型上大笑~');
}

1.原型链继承

function Male(){
    this.run = function(){
        console.log('跑的快~');
    }
}
Male.prototype = new Person();
//要为Male增加原型方法属性的话只能在 new Person()之后;

缺点就是次方法会将Male的构造函数constructor改变为Person;

2.构造继承

function Male(){
    Person.call(this);
    this.run = function(){
        console.log('跑的快~');
    }
}

3.实例继承

//直接返回的是Person的实例
function Male(){
    var res = new Person();
    res.name = 'res';
    return res;
}

4.拷贝继承

//实际就是对继承对象的原型上的属性进行了遍历
function Male(){
    var res = new Person();
    for(var key in res){
        Male.prototype[key] = res[key];
    }
    Male.prototype.name = 'male';
}

5.组合继承

function Male(){
    Person.call(this);
    this.name = 'male';
}
Male.prototype = new Person();
Male.prototype.constructor = Male;

6.寄生组合继承 (推荐

function Male(){
    Person.call(this);
    this.name = 'male';
}
(function(){
    var Super = function(){};
    Super.prototype = Person.prototype;
    Male.prototype = new Super();
})();

Male.prototype.constructor = Male;
CATALOG
  1. 1. JavaSctipt 继承
    1. 1.1. Super code
      1. 1.1.1. 1.原型链继承
      2. 1.1.2. 2.构造继承
      3. 1.1.3. 3.实例继承
      4. 1.1.4. 4.拷贝继承
      5. 1.1.5. 5.组合继承
      6. 1.1.6. 6.寄生组合继承 (推荐)