JavaScript中的几种继承方式
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()函数实现了寄生组合继承的最简单形式.
优点:只调用一次超类型的构造函数
还没有评论,来说两句吧...