概述
JavaScript中的几种继承方式:
一:原型链
让原型对象等于另一个类型的实例.此时,原型对象包含一个指向另一个原型的指针,相应地,另一个原型中也包含着指向另一个构造函数的指针.
function A(){
this.prototype = true;
}
A.prototype.getAValue = function(){
return this.prototype;
}
function B(){
this.Bprototype = false;
}
//B继承A
B.prototype = new A();
var b = new B();
alert(b.getAValue()); //true
缺点:
1.包含引用类型值的原型属性会被所以实例共享.
2.在创建子类型的实例时,不能向超类型的构造函数传递参数.
二:借用构造函数
在子类型构造函数的内部调用超类型的构造函数
function A(name){
this.color =["red"];
this.name = name;
}
function B(){
//B继承A
A.call(this,"Tom");
}
var b = new B();
alert(b.name); // Tom
b.color.push("blue");
alert(b.color); // red,blue
var b2 = new B();
alert(b.color); // red
优点:可以在子类型构造函数向超类型的构造函数传递参数.
缺点:
1.如果仅仅借用构造函数,那么将无法避免构造函数存在的问题:方法都在构造函数中定义,因此函数无法复用.
2.在超类型中定义的函数,在子类中不可见,只能使用构造函数模式,因此,这种方式很少单独使用.
三:组合继承
使用原形链实现对原型属性和方法的继承,通过借用构造函数实现对实例属性的继承,这是JavaScript中最常用的继承模式.
缺点:调用两次超类型的构造函数
四:原型式继承
在object()函数内部先创建一个临时性的构造函数,然后将传人的对象作为这个构造函数的原型,最后再返回这个临时类型的新实例
function object(o){
function F(){}
F.prototype = o;
return new F();
}
缺点:包含引用类型值的属性始终都会共享相应的值,就像使用原型模式一样.
在没必要创建构造函数,而只是想让一个对象和另一个对象保持类似的情况下,可以使用原型式继承.
五:寄生式继承
创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再返回对象.
function createAnother(o){
var clone = object(o);
clone.sayHi(){
alert('hi');
};
return clone;
}
var Person = {
name: "Tom"
};
var anotherPerson = createAnother(Perpso);
anotherPerson.sayHi(); //"hi"
缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率(与构造函数模式类似).
六:寄生组合式继承
用借用构造函数来继承属性,通过原型链的混成形势来继承方法.
思路:不必为了指定子类型的原型而调用超类型的构造函数,而所需要的无非就是超类型原型的一个副本而已.本质上就是,使用寄生式继承来继承超类型的原型,然后再将结果指 定给子类型的原型.
function inheritPrototype(B,A){
var prototype = object(A.prototype); //创建对象
prototype.constructor = B; //增强对象
B.prototype = prototype; //指定对象
}
inheritPrototype()函数实现了寄生组合继承的最简单形式.
优点:只调用一次超类型的构造函数
最后
以上就是老迟到钢笔为你收集整理的JavaScript中的几种继承方式的全部内容,希望文章能够帮你解决JavaScript中的几种继承方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复