这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
最近一直在学 Javascript,打算写一些文章,算做自己的学习心得吧,也可以算是学习笔记。没有系统的知识点,太基础的不想写,主要是写一些自己觉得有价值的地方
Javascript 究竟是一门面向对象的语言,还是一门支持对象的语言,我想每个人都有着自己的看法。那些 Javascript 忠实的 Fans 一定讲 Javascript 是一门面向对象的语言,像《Javascript 王者归来》一书中对 Javascript 的说法是基于原型的面向对象。我谈谈我个人的看法。面向对象的三个特征,继承,多态,封装,Javascript 虽然实现起来不像 Java,C# 等面向对象的语言来得快,但是毕竟也有着一定的支持。因此说 Javascript 是面向对象的语言是有着一定道理的,但是从继承这个部分来谈,一系列的继承法,但是每个继承法都无法实现真正面向对象语言的威力,因此,说他面向对象有着一定的牵强。综上,我对 Javascript 的理解,更愿意把它叫做一种简化的面向对象,或者说 "伪" 面向对象(这个伪字绝无贬义)。 今天就从面向对象这个第一个特征:继承来谈。 什么是继承?这个我不想废话,有一只动物,有一个人,有一个女孩,这个就是一个最简单,也是典型的继承链。 在 C# 等面向对象中,很容易。
- 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 来改进! 接着看代码,还是上面的例子(为了更加容易大家理解,需求改变一下,Animal 有了名字):
- 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 》。 对象伪装,这只是一种实现继承的方式,在接下来的文章,我会继续写出其他的继承方式以及几种继承方式的优劣,欢迎继续关注。
来源: http://www.phperz.com/article/17/0413/276043.html