日期:2014-05-16  浏览次数:20273 次

JavaScript 原理详解之类继承

/**

?* 主要讲述继承机制的实现问题

?* @author cuitongxin

?*/

?

/**

?* 1、对象冒充的方式

?* 原理:

?* 构造函数使用this来给所有的属性和方法赋值,因为构造函数只是一个函数,所以是一个构造函数可以成为

?* 另一个对象的方法,然后在对象中像普通方法一样调用它,该构造方法就会把在它构造函数中定义的属性和方法传递给当前的对象,

?* 当前对象就拥有了构造函数中的所有属性和方法。

?* 注意:

?* 对象中新的属性和方法,要在delete之后定义。

?* 该种继承方式支持多继承的形式。

?*/

function ClassA (sdf) {

this.ss = sdf;

this.showMsg = function() {

alert(this.ss);

};

}

function ClassB (tt) {

this.newMethod = ClassA;

this.newMethod(tt);

delete this.newMethod;

}

?

?

/**

?* 2、call 方法

?* 说明:它的第一个参数用作调用call的函数内的this对象所指的对象。其他的参数直接传递给调用call的函数自身。

?* 上例子中的代码可以简化为如下形式

?*/

function ClassB (tt,ss) {

ClassA.call(this,tt);

this.ss = ss;

this.showMsg2 = function() {

alert(ss);

};

}

?

/**

?* 3、apply方法

?* 说明:该方法同样第一参数为this对象,第二个参数为传递给调用者的数组。

?* 实现的代码同上

?*/

?

?

/**

?* 4、原型链

?* 说明:原型中的所有属性和方法都将被传递给该类的所有实例。

?* 注意:构造函数中没有参数。

?*/

function ClassA () {

}

ClassA.prototype.ss = "ss";

ClassA.prototype.showMsg = function () {

alert(this.ss);

};

function ClassB () {

}

ClassB.prototype = new ClassA();

?

/**

?* 5、混合的方式: 原型链 / 冒充方法

?* 这样就不需要考虑原型链中不能带参数的情况了

?*/