iLife中的JavaScript-Constructor

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;

为什么下面的代码不返回Person对象?而是返回未定义的


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();