7、js基础:继承实现技术(解决继承含有的缺点)

1、原型链实现继承存在的问题:(因为这些问题的存在,实践中很少会单独使用原型链)
(1)、由于共享的特性,而造成修改一个父级的一个引用类型属性值时,会影响到其他实例
(2)、没办法在不影响所有对象实例的情况下,给超(父)类型的构造函数传递参数
2、借用构造函数(伪造对象、经典继承)
优点:
解决原型中包含引用类型值所带来的连带修改的问题
可以在子类型构造器中项超类型构造函数场地参数
概念:在子类构造函数的内部调用超(父)类型构造函数(使用call()或apply()改变作用域)
缺点:存在构造函数模式存在的问题,方法都在构造函数中定义,没法复用了(所以很少单独使用)
eg:

function A(){
    this.colors = ["red","blue","green"];
}
function B(){
    A.call(this);//继承了A
}

var b1 = new B();
b1.colors.push("black");
alert(b1.colors);//"red,blue,green,black"

var b2 = new B();
alert(b2.colors);//"red,blue,green"没有被b1的修改而影响到

3、组合继承(伪经典继承)
1、概念:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承

//定义A类构造函数
function A(name){
    this.name = name;
    this.colors = ["red","blue","green"];
}
A.prototype.sayName = function(){
    alert(this.name);
}

//定义B类构造函数
function B(name,age){
    A.call(this,name);//继承A的属性
    this.age = age;
}
B.prototype = new A();//继承A的方法
B.prototype.constructor = B;
B.prototype.satAge = function(){
    alert(this.age);
}

var b1 = new B("tom",22);
b1.colors.push("black");
alert(b1.colors);// ["red","blue","green","black"];
b1.sayName();//"tom"
b1.sayAge();//22

var b2 = new B("sam",21);
alert(b1.colors);// ["red","blue","green"];
b1.sayName();//"sam"
b1.sayAge();//21
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值