/** * 用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); */ function add(a,b){ alert(a+b); } function sub(a,b){ } add.call(sub, 3, 1);//alert 4
/** * call 的意思是把 animal 的ShowName方法放到cat上执行;所以运行结果为:alert(‘Cat‘); */ function Animal(name){ this.name = ‘Animal‘; this.ShowName = function(){ alert(this.name); } } function Cat(name){ this.name = "Cat"; } var animal = new Animal(); var cat = new Cat(); animal.ShowName.call(cat);
/** * Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了. * */ function Animal(name,name2){ this.name = name; this.name2 = name2; this.ShowName = function(){ alert(this.name); alert(this.name2); } } function Cat(name1,name){ Animal.call(this,name1,name); } var cat = new Cat(‘我是老虎‘,‘我是病猫‘); cat.ShowName();
/** * Class2同时继承Class10和Class11 * */ function Class10() { this.ShowSub = function(a,b){ alert(a-b); } } function Class11() { this.ShowAdd = function (a,b){ alert(a+b); } } function Class2() { Class10.call(this); Class11.call(this); }
var cls2 = new Class2();cls2.ShowSub(5,2);//alert(3)cls2.ShowAdd(7,2);//alert(9)
接下来是apply的用法与理解
/** *apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. *call:和apply的意思一样,只不过是参数列表不一样. * .call(obj, arg1, arg2, arg3, ...); * .apply(obj,[arg1, arg2, arg3, ...]) */ / function Class10(name1,name2) { this.name1 = name1; this.name2 = name2; this.ShowName = function(){ alert(‘name1:‘ + this.name1); alert(‘name2:‘ + this.name2); } } function Class11(name1,name2,age) { this.age = age; Class10.apply(this,arguments);//此处,Class11劫持了Class10的属性[name1,name2,age]与方法ShowName(); this.ShowAge = function(){ alert(‘age:‘ + this.age); } } var cls = new Class11(‘名字1‘,‘名字2‘,‘好几岁了‘); cls.ShowName(); cls.ShowAge();
代码大多是网上找的资料,然后自己随手做了一下小改动,测试通过,便于自己理解-w-
便于理解的格式:
父类.call(子类);
父类.apply(子类,arguments);
和C#相反:
class 子类 : 父类 { ... }
时间: 2024-10-28 22:19:41