在ECMAScript语言规范中,是没有继承这些概念的。本文讨论的继承,是通过对象冒充机制来实现的。其实对象冒充也不是ECMAScript的术语,其是在开发者开始理解函数的工作方式,尤其是如何在函数环境中使用this关键字后才发展出来的。
所谓对象冒充,其原理很简单:构造函数使用this关键字给所有的属性和方法赋值。因为构造函数只是一个函数,所以可以使classA的构造函数成为classB的方法,然后调用它。classB就会收到classA的构造函数中定义的属性和方法。
function ClassA(sColor)
{
this.color=sColor;
this.sayColor=function()
{
alert(this.color);
}
}
function ClassB(sColor)
{
//newMethod指向ClassA
this.newMethod=ClassA;
//调用newMethod
this.newMethod(sColor);
/*delete this.newMethod;*/
}
这个 原理就是吧classA作为常规函数来建立继承机制,而不是作为构造函数。
var objA=new ClassA("red");
var objB=new ClassB("blue");
objA.sayColor(); //output red
objB.sayColor(); //output blue
alert(objB.color); //output blue
objA.sayColor(); //output red
对于以上的代码,我的理解是ClassB调用newMethod后,获得了ClassA的属性和方法的一个副本,这一点从上面的输出结果可以得知。而如果不执行
delete this.newMethod;
则ClassB的newMethod继续持有对ClassA的引用。但是执行下面的语句
objB.newMethod.sayColor();
是没有输出的。既然newMethod是指向ClassA的指针,理论上讲,应该可以访问sayColor的。求各位大牛共同研讨。
(本来内容来自《JavaScript高级程序设计》 Arthor Nicholas C.Zakas,尊重原创,此处拿出来,仅供学习讨论)