继承以实现多样性,使用开发者定义的“类”都可以作为基类被继承,当然,出于安全原因,本地“类”与宿主“类”不能作为基类被继承(ECMAScript中没有类这个定义,只有对象,所以这里的“类”是打了引号的)
本地“类”—ECMA-262定义的类(引用类型),它们包括:
Object,Function,Array,String,Boolean,Number,Date,RegExp,Error,EvalError,RangeError,ReferenceError,SyntacError,TypeError,URIError
宿主“类”—浏览器(宿主环境)提供的对象,它们有:
navigatior,document,windows,location,history
继承方式
1.对象冒充
通过构造函数使用this关键词给属性和方法赋值(利用了this灵活的指向当前的执行对象的性质)。
function Person1(sName){
this.name = sName;
this.say = function () {
alert(this.name);
};
}
function Person2(sName){
this.Method = Person1;
this.Method(sName);
delete this.Method; //删除对Person1的引用
}
对象冒充支持多重继承,但是如果继承的两个基类有相同的属性与方法,后继承的会覆盖先继承的~
function ClassC(){
this.Method = ClassA;
this.Method();
delete this.Method; //删除对ClassA的引用
this.Method = ClassB;
this.Method();
delete this.Method; //删除对ClassB的引用
}
为了解决覆盖问题,ECMAScript第三版中,Function增加了方法call(),apply()
2.call方法
call()的第一个参数为this对象,其余参数传递给函数本身,成为函数的参数。
function saySth(sStr1,sStr2){
alert(sStr1 + this.str + sStr2);
}
var obj = new Object();
obj.str = "Hey";
saySth.call(obj,"Say:",",yo man!"); // "Say:Hey,yo man!"
与对象冒充法一起使用~
function Person2(sName,sSex){
Person1.call(this,sName);
this.sex = sSex;
this.saySex = function(){
alert("I'm a " + this.sSex);
};
}
3.apply方法
apply()有2个参数,第一个为this对象,第二个为传递给函数的数组。
function saySth(sStr1,sStr2){
alert(sStr1 + this.str + sStr2);
}
var obj = new Object();
obj.str = "Hey";
saySth.call(obj,new Array("Say:",",yo man!")); // "Say:Hey,yo man!"
与对象冒充法一起使用~
function Person2(sName,sSex){
Person1.apply(this,arguments);
this.sex = sSex;
this.saySex = function(){
alert("I'm a " + this.sSex);
};
}
4.原型链
function Person(){}
Person.prototype.name = "Pada";
Person.prototype.say = function(){
alert("My name is " + this.name);
};
function Person2(){}
Person2.prototype = new Person();
注意,子类的所有属性和方法都必需定义在prototype属性被赋值之后,因为当prototype属性定义后,原型指向发生改变,原始对象将被销毁~也因此,原型链方法不支持多重继承~
5.混合方式
综上所述,对象冒充必需使用构造函数,而使用原型链实现继承却无法使用带参的构造函数,因此我们可以将二者混合使用,用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。
function Person(sName) {
this.name = sName;
}
Person.prototype.say = function () {
alert("My name is " + this.name);
};
function Person2 (sName,sSex) {
Person.call(this, sName);
this.sex = sSex;
}
Person2.prototype = new Person();
Person2.prototype.saySex = function(){
alert("I'm a " + this.sSex);
};
欲了解更多关于原型链详情,请移步:JS原型~