[英]JavaScript - constructior inside IIFE
為什么下面的代碼不返回Person對象? 相反,它返回未定義的小提琴
var factory = (function () {
function Person(name, salary) {
this.name = name;
this.salary = salary;
}
Person.prototype.talk = function () {
console.log('talking...');
}
return {
Person: Person
}
})();
var x = factory.Person('me', 100);
x.talk(); //cannot read property talk of undefined
因為這不是一個合適的工廠:
var factory = (function () {
function Person(name, salary) {
this.name = name;
this.salary = salary;
}
Person.prototype.talk = function () {
console.log('talking...');
}
return {
Person: function(name,salary){
return new Person(name,salary);
}
}
})();
var x = factory.Person('me', 100);
x.talk(); //cannot read property talk of undefined
如果您不對Person調用new,那么將沒有原型繼承。
編輯:您可以在工廠方法上更抽象,因此您可以更改構造函數的參數而不會影響工廠
return {
Person:function(){
return new (Function.prototype.bind.apply(Person,arguments));
}
}
或使構造函數成為一個不道德的工廠
function Person(name, salary) {
if(!(this instanceof Person)){
return new (Function.prototype.bind.apply(Person,arguments));
}
this.name = name;
this.salary = salary;
}
合適的答案已經已經發布,但是我只是想表明實現通過確保構造函數總是返回的新實例相同結果的不同方式Person
,即使new
遺忘。
var factory = (function () {
function Person(name, salary) {
if (!(this instanceof Person)) return new Person(name, salary);
this.name = name;
this.salary = salary;
}
Person.prototype.talk = function () {
console.log('talking...');
}
return {
Person: Person
}
})();
var x = factory.Person('me', 100);
x.talk();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.