2012-11-05 43 views
15

讓我們來看看兩個例子,我將嘗試解釋我想要理解的內容。創建一個JS類:IIFE與返回原型

var Car = function(){ 
    // Init class 
    function Car() { }; 
    // Private func/vars 
    var private = { color:'red' }; 
    // Public func/vars 
    Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
    }; 

    return Car.prototype; // return with prototype 
}; 

var myCar = new Car(); 

和:

var Car = (function(){ 
    // Init class 
    function Car() { }; 
    // Private func/vars 
    var private = { color:'red' }; 
    // Public func/vars 
    Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
    }; 

    return Car; // avoid prototype adding parentheses on next line; 
})(); 

var myCar = new Car(); 

讓我們來看看! 這兩個類中創建爲函數表達式,並都同樣的工作。 它們之間的唯一區別是: 第一個返回Car函數及其原型屬性。 第二個工作返回Car函數,避免了原型屬性,而是使用IIFE。

使用return Car.prototype;和避免使用IIFE和使用return Car;使用IIFE(在類聲明結尾的括號)之間有什麼區別。

+0

究竟是什麼你想實現什麼? – alex

+0

我試圖理解它如何深入工作的理論,以及技術上的差異。 –

+1

您是否打算在兩個'Car'對象返回時使用'new'運算符? – alex

回答

15

第二個代碼示例是實現所需內容的正確方法。你創建一個立即執行的函數,在其中創建一個新函數,添加到它的原型,然後返回它。

第一個例子有點奇怪,並沒有完全建立一個構造函數。該生產線

return Car.prototype; // return with prototype 

使你的汽車功能簡單地總是返回對象文本您以前分配給Car.prototype。這將覆蓋函數與new


一件事調用的正常行爲要注意,這條線:

Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
}; 

將導致constructor屬性的新創建的對象不再指向你的車功能。如果這對你很重要,有兩種簡單的方法可以解決這個問題。

Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
}; 
Car.prototype.constructor = Car; // <-------- add this line 

或更改上面

Car.prototype.newColor = function(color) { private.color = color }; 
Car.prototype.getColor = function() { return private.color }; 
+0

非常有趣! –