JS系列总结笔记——4.JS继承

1.类式继承
// 父类
var SuperClass = function() {
    this.superValue = true;
}
// 子类
var SubClass = function() {
    this.subValue = false;
}

SubClass.prototype = new SuperClass();  // 原型指向父类的实例,即可继承父类的方法
SubClass.prototype.constructor = SubClass;  // 将构造函数指向本身

缺点:

  • 子类对象可以改变父类对象的共有属性(这里一般说引用类型,值类型也可更改,需要通过proto,有些浏览器不允许这么做);
    例如:
var SuperClass = function() {
this.superValue = true;
    this.books = ['js', 'h5', 'css3'];
}
var SubClass = function() {
    this.subValue = false;
}
SubClass.prototype = new SuperClass();  
SubClass.prototype.constructor = SubClass;  

var sub1 = new SubClass();
var sub2 = new SubClass();

console.log(sub1.books);  // ["js", "h5", "css3"]
console.log(sub2.books);  // ["js", "h5", "css3"]

sub1.books.push('设计模式');  

console.log(sub1.books);  // ["js", "h5", "css3", "设计模式"]
console.log(sub2.books);  // ["js", "h5", "css3", "设计模式"]
  • 子类对象属性无法定制,例如想要sub1.books为[‘js’],sub2.books为[‘css’]就无法实现

2.构造函数继承
var SuperClass = function(id) {
    this.id = id;
    this.books = ['js', 'h5', 'css3'];
};

var SubClass = function(id) {
    SuperClass.call(this, id);
};

var sub1 = new SubClass('1');
var sub2 = new SubClass('2');

sub1.books.push('设计模式');  

console.log(sub1.books);  // ["js", "h5", "css3", "设计模式"]
console.log(sub2.books);  // ["js", "h5", "css3"]

缺点:有些属性可能是公有的,没必要每个对象都有一份独立的。


3.组合继承
var SuperClass = function(id) {
this.id = id;
    this.books = ['js', 'h5', 'css3'];
};
SuperClass.prototype.getId = function() {
    return this.id;
}
var SubClass = function(id, name) {
    SuperClass.call(this, id);
    this.name = name;
};
SubClass.prototype = new SuperClass();
SubClass.prototype.constructor = SubClass;

SubClass.prototype.getName = function(){
    return this.name;
}

缺点:父类的构造函数跑了两遍,在子类对象的proto中存在与子类对象的同名变量,造成空间浪费。


4.寄生式继承
var book = {
    name: '设计模式',
    alikeBook: ['css book', 'html book']
}

var createBook = function(o) {
    var inheritObject = function(o) {
        var oFn = function() {  };
        oFn.prototype = o;
        return new oFn;
    }
    var obj = inheritObject(o);
    obj.getName = function() {console.log(this.name);};
    return obj;
}

缺点:硬要说缺点的话,感觉继承的属性方法放在proto上有点奇怪(强迫症…),不过既然是继承的,在proto上也很合理。


5.终极继承–寄生组合式继承
var SuperClass = function(id, name){
 this.id = id;
  this.name = name;
 }

 SuperClass.prototype.getName = function() {
  return this.name;
 }

 var SubClass = function(id, name, price){
  SuperClass.apply(this, [id, name]);
  this.price = price;
 }
 var inheritObject = function(o) {
  var oFn = function() {};
  oFn.prototype = o;
  return new oFn;
 }
 SubClass.prototype = inheritObject(SuperClass.prototype);
 SubClass.prototype.constructor = SubClass;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值