在通過網絡閱讀其他人的源代碼和各種文章時,我發現當不同的人在JavaScript中使用「面向對象風格」的編程時,他們通常會做得非常不同。JavaScript - 構建對象的不同方式
假設我想創建一個具有1個屬性和1個函數的小模塊。我已經看到至少4個方法,應付這一任務:
// Option 1
var myObject1 = {
myProp: 1,
myFunc: function() { alert("myProp has value " + this.myProp); }
};
// Option 2
var myObject2 = function() {
return {
myProp: 1,
myFunc: function() { alert("myProp has value " + this.myProp); }
};
}();
// Option 3
var MyObject3 = function() {
this.myProp = 1;
this.myFunc = function() { alert("myProp has value " + this.myProp); }
};
var myObject3 = new MyObject3();
// Option 4
var MyObject4 = function() { };
MyObject4.prototype.myProp = 1;
MyObject4.prototype.myFunc = function() { alert("myProp has value " + this.myProp); };
var myObject4 = new MyObject4();
所有這些方法在語法上不同,但似乎產生可以以同樣的方式被使用的對象。
它們之間的語義差異是什麼?有什麼情況是因爲某種原因,我應該選擇其中一種方法來處理所有其他問題?
選項2是沒有意義的,除非您在return語句之前添加更多代碼,可能會添加一些可從返回對象的方法中訪問的變量 - 否則它只是包含在冗餘IIFE中的選項1。選項1和2創建單例,而選項3和4爲您提供可用於創建多個實例的構造函數。而且你已經錯過了選項5,這將是3和4,但每個實例myProp設置,並在原型上設置myFunc()。 – nnnnnn
可能的重複:[如何「正確」在JavaScript中創建自定義對象?](http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript) – Roberto