黑马程序员技术交流社区
标题:
在javascript脚本语言中,怎么体现继承的特性呢?
[打印本页]
作者:
┾——黑马
时间:
2013-9-15 17:41
标题:
在javascript脚本语言中,怎么体现继承的特性呢?
在javascript中的多态,封装本人已知道了!但是对继承的认真还是模模糊糊的..
作者:
┾——黑马
时间:
2013-9-15 21:07
怎么没有人回答啊?怎么也没有加分啊!{:soso_e167:}
作者:
0和1,编程世界
时间:
2013-9-23 21:42
javascript 中的任何对象都具有prototype 属性,包括作为构建函数的函数对象。prototype 在初始化时只有一个属性constructor, 指向该对象的构建函数。所以,在构建函数的prototype 对象中添加的所有方法都可以通过对象实例的 prototype访问。当访问一个对象的方法或属性时,javascript 首先查找对象本身是否具有该属性,如果未找到,则继续查找prototype 对象中是否含有该属性。这就是javascript 实现对象继承的基本原理。
作者:
0和1,编程世界
时间:
2013-9-23 21:49
面向对象语言有能力支持类以及类中方法和属性的重用,在JavaScript中实现继承可以通过本身的多种方法来实现,比如call()、 apply()、仿冒、原型链,其中各有优缺点,此外还可以通过一些外部库实现继承的能力,比如xbObject、zinherit等。
一.通过对象仿冒来实现继承:
1. <script type="text/javascript">
2. function Parent(pName){
3. this.name = pName;
4. this.sayMyName = function(){
5. alert(this.name);
6. };
7. }
8.
9. function Mother(pName){
10. this.name = pName;
11. this.sayMyName = function(){
12. alert(this.name+"sex*y");
13. };
14. }
15.
16. function Child(cName,cNumber){
17. this.myFace = Parent;
18. this.myFace(cName);
19. delete this.myFace;
20.
21. this.myFace = Mother;
22. this.myFace(cName);
23. delete this.myFace;
24.
25. this.number = cNumber;
26. this.sayNumber = function(){
27. alert(this.number);
28. };
29. }
30.
31. var ObjP =new Parent("HideHai");
32. var ObjM =new Mother("Hidewow");
33. var ObjC =new Child("HideLow",3);
34.
35. ObjP.sayMyName();
36. ObjM.sayMyName();
37. ObjC.sayMyName();
38. ObjC.sayNumber();
39. </script>
二.使用call()实现对象继承:
call(obj,option....) 第一个参数是输入对象作为当前的this,其余的参数传递给函数本身。
1. <script type="text/javascript">
2. function Parent(pName){
3. this.name = pName;
4. this.sayMyName = function(){
5. alert(this.name);
6. };
7. }
8.
9. function Mother(pName){
10. this.name = pName;
11. this.sayMyName = function(){
12. alert(this.name+"sex*y");
13. };
14. }
15.
16. function Child(cName,cNumber){
17.
18. Parent.call(this,cName);
19.
20. Mother.call(this,cName);
21.
22. this.number = cNumber;
23. this.sayNumber = function(){
24. alert(this.number);
25. };
26. }
27.
28. var ObjP =new Parent("HideHai");
29. var ObjM =new Mother("Hidewow");
30. var ObjC =new Child("HideLow",3);
31.
32. ObjP.sayMyName();
33. ObjM.sayMyName();
34. ObjC.sayMyName();
35. ObjC.sayNumber();
36. </script>
三.使用apply()方法实现继承:
apply(obj,options[...]) 第一个参数等同于call方法的第一个参数,第二个参数为一个以传入参数为元素的数组。
1. .... //代码同上
2. function Child(cName,cNumber){
3.
4. Parent.apply(this,new Array(cName));
5.
6. Mother.call(this,new Array(cName));
7.
8. this.number = cNumber;
9. this.sayNumber = function(){
10. alert(this.number);
11. };
12. }
四.使用原型链实现继承:
关键代码为 Child.prototype = new Parent(); 将Parent的属性和方法赋予Child。在原型链的使用中,对子类的构造函数不传递参数是标准做法。
1. <script type="text/javascript">
2. function Parent(pName){
3. this.name = pName;
4. this.sayMyName = function(){
5. alert(this.name);
6. };
7. }
8.
9. function Child(){
10. }
11. Child.prototype = new Parent();
12. Child.prototype.name = "";
13. Child.prototype.number = 0;
14. Child.prototype.sayNumber = function(){
15. alert(this.number);
16. };
17.
18. var ObjP =new Parent("HideHai");
19. //var ObjM =new Mother("Hidewow");
20. var ObjC =new Child("HideLow");
21.
22. ObjC.name = "HideLow";
23. ObjC.number = 3;
24.
25. ObjP.sayMyName();
26. ObjC.sayMyName();
27. ObjC.sayNumber();
28. </script>
作者:
Always.
时间:
2013-9-24 00:25
设置对象的方法:
Person.prototype.toString() {
return this.first + " " + this.last;
}
alert( person.toString() ); // displays "John Dough"
alert( person ); // alert函数将默认调用toString()函数
在这里我们用到了javascript中的prototype属性。所有的javascript对象都拥有一个prototype属性,javascript就是通过这个属性来实现继承关系的。具体的实现机制是这样的:当你访问一个对象的属性时,编译器将先查找对象的属性看有没有匹配的。如果没有找到,将继续查找这个对象的prototype属性所指的对象,看是否存在匹配的属性。如果还是没有找到,编译器将检查当前对象的prototype是否拥有prototype属性,如果有将继续查找下去。以此类推,直到查找完所有的prototype属性。
从这个过程不难看出,存在着一个类似于继承的访问链,可以把prototype对象指向我们要继承的父类,以此来访问父类的方法。
希望能帮到你!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2