寄生构造器模式可以看作是工厂模式和构造器模式的结合。在工厂模式中,我们调用一个函数,该函数显式地创建一个对象并向该对象添加所需的属性和方法,最后返回该对象。
function createPerson(name, age, job){
var o = new Object(); //explicit object creation
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);
var person2 = createPerson(“Greg”, 27, “Doctor”);
注意事项:
- 创建并返回显式对象
- 方法和属性被添加到显式创建的对象
- 方法在没有
new
操作符的情况下被调用
缺点:它不允许识别对象的类型。
任何函数都可以通过使用运算符调用它来视为构造函数new
。在没有new
操作符的情况下调用时,在函数内部,this
对象指向全局对象(window
在浏览器中)。并且当使用操作符调用该函数时new
,它首先创建新的实例,object
然后将this
对象设置为新创建的对象。
构造函数模式将方法和属性添加到this
对象并最终返回this
对象,从而允许稍后使用instanceOf
运算符识别对象的类型。
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person(“Nicholas”, 29, “Software Engineer”);
var person2 = new Person(“Greg”, 27, “Doctor”);
注意事项:
- 使用操作符调用函数
new
(使 JavaScript 引擎将其视为构造函数) - 对象未显式创建,而是
this
返回对象
现在,寄生构造器模式显式地创建并返回一个类似于工厂模式的对象,并使用类似构造器模式的 new 运算符调用它:
function Person(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var friend = new Person(“Nicholas”, 29, “Software Engineer”);
friend.sayName(); //”Nicholas”
但是我看不到使用new
运算符调用函数的用途。我的意思是,由于函数显式创建并返回对象,我们将无法使用instanceOf
运算符显式识别对象类型。
那么寄生构造器模式有什么好处呢?是否有任何技术细节可以被利用或适用于特定的对象创建场景?或者只是创建对象的另一种可能的编程方法?