iLife中的JavaScript-Constructor
为什么下面的代码不返回Person对象?而是返回未定义的iLife中的JavaScript-Constructor,javascript,Javascript,为什么下面的代码不返回Person对象?而是返回未定义的 var x=factory.Person('me',100)将调用factory.Person()(它只设置this.name和this.salary,不返回任何内容,因此未定义) 您要使用关键字: 因为它不是一个合适的工厂: var factory = (function () { function Person(name, salary) { this.name = name;
var x=factory.Person('me',100)
将调用factory.Person()
(它只设置this.name
和this.salary
,不返回任何内容,因此未定义
)
您要使用关键字:
因为它不是一个合适的工厂:
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
如果你不给新人打电话,就不会有原型遗传
编辑:您可以对工厂方法更抽象一些,这样您就可以在不影响工厂的情况下更改构造函数的参数
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();
这正是我想要的。
function Person(name, salary) {
if(!(this instanceof Person)){
return new (Function.prototype.bind.apply(Person,arguments));
}
this.name = name;
this.salary = salary;
}
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();