js 模拟“类”继承
来源:互联网 发布:小学生学汉字软件 编辑:程序博客网 时间:2024/06/01 09:07
javascript中实际上是没有类这个概念的,他的类是在方法的基础之上的,因此实现类继承的思想是把父类的属性和方法指向子类。(个人理解)
JavaScript 中的继承可以通过原型链来实现,调用对象上的一个方法,由于方法在JavaScript 对象中是对
另一个函数对象的引用,因此解释器会在对象中查找该属性,如果没有找到,则在其内部对象prototype 对象
上搜索,由于prototype 对象与对象本身的结构是一样的,因此这个过程会一直回溯到发现该属性,则调用该
属性,否则,报告一个错误。关于原型继承,我们不妨看一个小例 子
function Base(){this.baseFunc=function(){alert("base behavior");}}function Middle(){this.middleFunc=function(){alert("middle behavior");}}Middle.prototype=new Base();function Final(){this.finalFunc=function(){alert("final behavior");}}Final.prototype=new Middle();function test(){var obj = new Final();obj.baseFunc();//base behaviorobj.middleFunc();//middle behaviorobj.finalFunc();//final behavior}test();
例子二:
function ClassA(sColor) {this.color = sColor}ClassA.prototype.sayColor = function () {alert(this.color);}function ClassB(sColor, sName) { //执行ClassA(sColor)方法,但是里面的this现在已经是ClassB了,但是sayColor方法没有继承过来,因为是在prototype原型链表后的,只有new ClassA才能继承,这个方法的目的就是实现属性的继承ClassA.call(this, sColor);this.name = sName;}//将ClassA链表后面的方法赋值给ClassB.prototype,这样sayColor方法也就在ClassB链表后面,实现方法继承ClassB.prototype = new ClassA();ClassB.prototype.sayName = function () {alert(this.name);}var obja = new ClassA("RED");var objb = new ClassB("blue", "huangbiao");obja.sayColor();//REDobjb.sayColor();//blueobjb.sayName();//huangbiao
使用运行构造方法实现继承
function ClassA(sColor) {this.color = sColor;this.sayColor = function () {alert(this.color);}}function ClassB(sColor) {}function ClassB(sColor, sName) {//定义一个构造方法属性,然后运行这个构造方法,实际上就是运行父类ClassA,将它的属性和方法全部继承过来,因为这个this指向的是ClassB而不是ClassA了this.struct = ClassA;this.struct(sColor);//删除这个构造属性,但是够着属性里面的内容已经继承过来了,因此删除这个多余的属性delete this.struct;this.name = sName;this.sayName = function () {alert(this.name);}}var obja = new ClassA("RED");var objb = new ClassB("blue", "huangbiao");alert(objb.color);//blueobja.sayColor();//REDobjb.sayColor();//blueobjb.sayName();//huangbiao