JavaScript中借用构造函数(Constructor Stealing)继承所发现的东西

之前在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复制下来的属性副本一样。

posted @ 2018-01-11 16:15  linweiws  阅读(154)  评论(0编辑  收藏  举报