簡體   English   中英

JavaScript-IIFE內部的構造函數

[英]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;
        }

var x = factory.Person('me', 100); 將調用factory.Person() (僅設置this.namethis.salary ,並且不返回任何內容,因此undefined )。

您要使用new關鍵字:

var x = new factory.Person('me', 100);
//      ^^^

小提琴

合適的答案已經已經發布,但是我只是想表明實現通過確保構造函數總是返回的新實例相同結果的不同方式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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM