JavaScript 原型继承
■知识点
原型继承是一种简化的继承机制,也是JavaScript原生支持的继承模式。在原型继承中,类和实例概念被淡化了,一切都从对象的角度来考虑。原型继承不再需要使用类来定义对象的结构,而是直接定义对象并被其他对象引用,这样就形成了一种继承关系,其中引用对象被称为原型对象。JavaScript能够根据原型链来查找对象之间的这种继承关系。
■实例设计
下面使用原型继承的方法设计类型继承。
function A(x){ //A类
this.xl= x; //A的私有属性xl
this.getl = function(){ //A的私有方法getl ()
return this.xl;
}
}
function B(x){ //B类
this.x2 = x; //B的私有属性x2
this.get2 = function () { //B的私有方法get2()
return this.x2 + this.x2;
};
}
B.prototype = new A(1); //原型对象继承A的实例
function C(x){ //C类
this. x3 = x; //C的私有属性x3
this.get3 = function(){ //C的私有方法get3()
return this.x3 * this.x3;
};
}
C.prototype = new B(2); //原型对象继承B的实例
在上面的示例中,分别定义了3个构造函数,然后通过原型链把它们串联在一起,这样C函数能够继承B函数和A函数的成员,而B函数能够继承A函数的成员。
Prototype的最大特点就是能够允许对象实例共享原型对象的成员。因此如果把某个对象作为一个类型的原型,那么这个对象的类型也可以作为那些以这个对象为原型的实例的父类。
此时,可以在C的实例中调用B和A的成员。
var b = new B(2); //实例化B
var c = new C(3); //实例化C
console.log(b.xl); //在实例对象b中调用A的属性xl,返回1
console.log(c.xl); //在实例对象C中调用A的属性xl,返回1
console.log(c.get3()); //在实例对象c中调用C的方法get3(),返回9
console.log(c.get2()); //在实例对象c中调用B的方法get2(),返回4
基于原型的编程是面向对象编程的一种特定形式。在这种编程模型中,不需要声明静态类,而是通过复制己经存在的原型对象来实现继承关系。因此,基于原型的模型没有类的概念,原型继承中的类仅是一种模式,或者说是沿用面向对象编程的概念。
■小结
原型继承的优点是结构简单,使用简便,但是也存在以下几个缺点。
每个类型只有一个原型,所以它不支持多重继承。
不能友好地支持带参数的父类。
a 使用不灵活。在原型声明阶段实例化父类,并把它作为当前类型的原型,这限制了父类实例化
的灵活性,无法确定父类实例化的时机和场合。
^ prototype属性固有的副作用。
点击加载更多评论>>