ECMAcript支持实现继承的方法主要依靠原型链。
1. 原型链
每个构造函数都有一个原型对象,原型对象都有一个指向构造函数的指针(constructor),而实例对象都有一个指向原型对象的内部指针。构造函数的原型对象如果指向另一个类型的实例。例子:
function SuperObj() {
this.property = true;
}
SuperObj.prototype.getVal = function() {
return this.property;
}
function SubObj() {
this.subproperty = false;
}
//继承SuperObj
SubObj.prototype = new SuperObj();
//再使用字面量来添加方法,会重写原型对象导致上行代码无效
SubObj.prototype = {
getSubVal: function() {
return this.subproperty;
},
otherMethod: function() {
return false;
}
}
var instance = new SubObj();
alert(instance.getVal()); //error
当不使用字面量重新定义原型时,上面的调用会弹出true,这是通过原型链的搜索机机制实现的。
- 可以看的通过原型实现继承时,所有实例都会共享原型对象上的属性与方法,当某一实例对原型对象进行更改时也会反应到其他的实例对象上,这显然是不合理的。
- 创建的子类型无法向超类型传递参数。
2. 借用构造函数实现继承
通过在子类型中调用超类型的构造函数来实现。例子:
function SupObj() {
this.color = ['red', 'blue'];
}
function SubObj(){
//继承SupObj
**SupObj.call(this);**
}
var inst1 = new SubObj();
inst1.color.push('pink');
alert(inst1.color); //"red, blue, pink"
var inst2 = new SubObj();
alert(inst2.color); //"red, blue"
通过借调超类的构造函数,使每个子类实例都有自己的color属性副本。
3. 组合继承
将原型链和借用构造函数技术组合到一起。通过原型链实现对原型属性和方法的继承,而通过借用构造函数的方法实现对实例属性的继承。例子:
function SuperObj(name) {
this.name = name;
this.colors = ['red', 'blue'];
}
SuperObj.prototype.sayName = function() {
alert(this.name);
}
function SubObj(name, age){
//继承属性
SuperObj.call(this, name);
this.age = age;
}
//继承方法
SubObj.prototype = new SuperObj();
SubObj.prototype.sayAge = function() {
alert(this.age);
}
这样就是实现了对父类属性与方法的继承,并继承上两个实现继承方法的优点。

196

被折叠的 条评论
为什么被折叠?



