javascript面向对象----继承

   什么是继承,你懂的。在javascript中实现继承,目前见过这么几种方法:

1. call和apply

    这两个方法作用差不多,用法不同。区分他们:
obj.call(this, arg1,arg2,arg3) == obj.apply(this, arguments)==this.obj(arg1, arg2, arg3)

call的第一个以外的参数是单个出现的,apply第一个以外的参数是以数组形式出现的;

他们可以使this具有obj的功能【我这么理解的】。看下代码1里如何使用calll和apply实现继承:

代码1:

 1 function Person(age, name) {
2 this.age = age;
3 this.name = name;
4 this.ShowAge = function () { alert("my age:"+age); }
5 }
6 function Baby(age,name) {
7 person.call(this, age, name);//可以换成 person.Apply(this,[age,name]);
8 }
 9 var baby= new Baby(2, "aa");
10 baby.ShowAge(); //执行,弹出结果:my age:2

代码1中有两个类:person和baby,baby的构造函数中,person类名调用call方法,使得baby类有了person类的能力。

代码第9行,创建baby类的对象,调用父类方法ShowAge()。

javascript 里可以用instanceof来测试一个对象是否是一个类的实例。 那么上段代码, alert(baby instanceof Person)

结果是false!

也就是说call,apply只是模拟了继承,山寨的哦。

2:原型继承
每一个类都有原型。如果一个类A的原型是某个对象B,于是乎A会继承B的类。

 1   function Person(age, name) {
2 this.age = age;
3 this.name = name;
4 this.show = function () { alert("my age:"+age); }
5 }
6 function Baby(age,name) {
7
8
9 }
10 Baby.prototype = new Person(12, "aa");
11 var baby = new Baby(12, "aa");
12 baby.show();
13 alert(baby instanceof Person);

javascript在执行那个show方法时,先找Baby类本身有没有,然后去找原型,他的原型是Person对象,于是找Person类,执行了Person类的show方法。如果Person类里没有show方法呢?同样的道理,你懂的,会接着往上,就是找Person类的原型,找它“爷爷”,所谓原型链嘛。

其他的继承方法。没记住,就不记录啦

posted on 2011-12-20 23:58  xinchuang  阅读(237)  评论(0编辑  收藏  举报