之前在Nicholas C.Zakas的书里见过一种叫Constructor Stealing的继承方式,这种方式可以由子类型向父类型传递参数,它的实现方式如下:
// 父类构造函数 function SuperType(name){ this.name=name; } // 子类构造函数 function SubType(name){ SuperType.apply(this,[name]); } // 子类向父类传递参数 var instance=new SubType("linwei"); // 此时instance自身有了name属性 console.log(instance.hasOwnProperty("name")); // true console.log(instance.name); // linwei
于是instance被绑定到SuperType上,于是instance复制了SuperType里的属性name,于是自身就有了name属性。
于是我疑心apply真可以为对象添加属性,便八卦心起,自己实验了一下
function Person(name){ this.name=name; } // 创建一个没有属性的对象 var obj={}; // 将obj绑定到Person上 Person.apply(obj,["linwei"]); console.log(obj.hasOwnProperty("name")); // true console.log(obj.name); //linwei
你看,obj就有了自己的属性name。
于是,我就想以后要创建相同类型的对象可以这样:
function Person(name,age){ this.name=name; this.age=age; } // 创建多个相同类型的对象 var obj1={}, obj2={}, obj3={}; // 用上述方式为每个对象添加属性 Person.apply(obj1,["linwei",20]); Person.apply(obj2,["Nicholas",29]); Person.apply(obj3,["David",45]);
于是每个对象都有自身的相应属性。
类似的作用不仅有apply/call绑定,我们平时所见new调用也是一样,还有这种情况也出现在"隐式绑定":
function Person(){ this.name="linwei"; } var obj={ Person:Person }; obj.Person(); console.log(obj.hasOwnProperty("name")); // true console.log(obj.name); // linwei
obj也有了自己的属性name,就好像从Person复制下来的属性副本一样。