Javascript完美继承方式 - 寄生组合

2018-02-26  本文已影响0人  liuuuuuu

定义一个动物类

// 定义一个动物类
function Animal (name) {
// 属性
this.name = name || 'Animal';
// 实例方法
this.sleep = function(){
console.log(this.name + '正在睡觉!');
}
}
// 原型方法
Animal.prototype.eat = function(food) {
console.log(this.name + '正在吃:' + food);
};

寄生组合继承

核心:通过寄生方式,去掉父类的实例属性,在调用两次父类的构造的时候,就不会初始化两次实例方法或属性,避免的组合继承的缺点,或者说是小bug。

function Cat(name){
  Animal.call(this);
  this.name = name || 'Tom';
}
/*
 * 立即执行函数
 * void function(){}() = (function(){})();
 * 在很早的javascript版本里面就有void的用法了,这里就不再过于赘述。
 * */
void function(){
  // 创建一个没有实例方法的类
  var Super = function(){};
  Super.prototype = Animal.prototype;
  //将实例作为子类的原型
  Cat.prototype = new Super();
  // 修复constructor
  Cat.prototype.constructor = Cat;
}();
var cat = new Cat();
var log = console.log;
log (cat.name);
log (cat.sleep());
log (cat instanceof Animal);
log (cat instanceof Cat);

优点: 在js继承的六种方法[原型链,组合,拷贝,实例,构造,寄生组合]中算得上完美的继承方式。
缺点: 实现起来稍微有点复杂。

说明

原创作品,禁止转载和伪原创,违者必究!

上一篇 下一篇

猜你喜欢

热点阅读