什么是继承,你懂的。在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类的原型,找它“爷爷”,所谓原型链嘛。
其他的继承方法。没记住,就不记录啦