Javascript玩转继承(一) |
本文标签:Javascript,玩转继承 Javascript究竟是一门面向对象的语言,还是一门支持对象的语言,我想每个人都有着自己的看法 。那些Javascript忠实的Fans一定讲Javascript是一门面向对象的语言,像《Javascript王者归来》一书中对Javascript的说法是基于原型的面向对象 。我谈谈我个人的看法 。面向对象的三个特征,继承,多态,封装,Javascript虽然实现起来不像Java,C#等面向对象的语言来得快,但是毕竟也有着一定的支持 。因此说Javascript是面向对象的语言是有着一定道理的,但是从继承这个部分来谈,一系列的继承法,但是每个继承法都无法实现真正面向对象语言的威力,因此,说他面向对象有着一定的牵强 。综上,我对Javascript的理解,更愿意把它叫做一种简化的面向对象,或者说"伪"面向对象(这个伪字绝无贬义) 。 复制代码 代码如下: class Animal { } class People:Animal { } class Girl:People { } 那么在Javascript中,没有类,没有继承的提供实现,我们该怎么做呢? 还是用上面的那个例子,代码如下: 复制代码 代码如下: function Animal() { this.Run=function(){alert("I can run");}; } function People(name) { //在这里就是传入了父类的构造方法,然后执行父类的构造方法,这个时候就//可以使用父类中的方法了 。 this.father=Animal; this.father(); //记得要删除,否则在子类添加于父类相同名称的方法时,会修改到父类 。 delete this.Father; this.name=name; this.Say=function(){alert("My name is "+this.name);} } function Girl(name,age) { this.father=People; this.father(name); delete this.father; this.age=age; this.Introduce=function(){alert("My name is "+this.name+".I am "+this.age);}; } 这样的话就实现了一个继承链,测试下: 复制代码 代码如下: var a=new Animal(); a.Run(); var p=new People("Windking"); p.Run(); p.Say(); var g=new Girl("Xuan",22); g.Run(); g.Say(); g.Introduce(); 结果如下: a. b. c. d. e. f. 测试成功! 我们来总结一下这段代码的关键,指定父类,声明父类对象,然后删除临时变量,您是否觉得有些麻烦呢?至少我是这么觉得的,一旦忘记了delete,还要承担父类被修改的风险,针对这个,我们对这个用call和apply来改进! 复制代码 代码如下: function Animal(name) { this.Run=function(){alert("I can Run");}; } function People(name) { //使用call方法实现继承 this.father=Animal; this.father.call(this,name); this.name=name; this.SayName=function(){alert("My name is "+this.name;);}; } function Girl(name,age) { //使用apply方法来实现继承 this.father=People; this.father.apply(this,new Array(name)); this.age=age; this.Introduce=function(){alert("My name is "+this.name+".I am "+this.age);}; } 用一样的测试代码,发现测试一样成功 。 如果是新手,可能看后面的这两段代码有些晕晕乎乎,什么是call,什么是apply呢?好,在玩转继承这个专题中,我加入一个增刊系列,如果对这个有不了解,可以看我的这个文章:《玩转方法:call和apply 》 。 |