2012-11-11 75 views
1

我從來沒有涉足這樣的JavaScript對象,但我認爲我有一個很好的理由。創建一個共享變量的對象

這是我的例子:我想打,設置了兩個變量貨盤和顏色數組對象

x = new Something(pallet,['blue','green','orange']); 
x.try(['blue']); 

然後在try函數中,我想傳遞一個數組,但在函數中我想訪問pallet和顏色對象。有人能告訴我這是否可能嗎?也許是一個小演示或教程?

+1

'try'是JavaScript關鍵字。不要將其用作屬性名稱。 :) – cdhowie

+0

可能重複的[你如何在JavaScript中定義一個OOP類?](http://stackoverflow.com/questions/2221401/how-do-you-define-an-oop-class-in-javascript) –

+0

@cdhowie嗯,作爲使用方括號的屬性名稱很好,並且在IE9 /任何其他格式中都可以。 – gsnedders

回答

1
function Something(pallet, colors) { 
var myColors = colors; 
var myPallet = pallet; 

function getColors() { 
    for (var i = 0; i < myColors.length; i++) { 
     document.write(myColors[i] + "<br />"); 
    } 
} 

return { 
    getColors: getColors 
}; 
} 

var mySomething = new Something('myNewPallet', ['green', 'red', 'blue']); 
mySomething.getColors(); 

好了,所以我們在這裏做的是創造一個封閉,然後返回getColors函數來實例化對象的東西的人。您可以閱讀關於關閉herehere。不過,基本上,您正在關閉顏色和托盤成員,並且由於getColors存在於Something()的上下文中,因此它可以訪問所有Something的成員。然後,通過將該函數返回給調用者,我們允許他們使用「捕獲」其托盤和顏色列表的對象調用該功能。

請記住,這是一個非常非常高層次的封閉視圖,特別是關於封閉模式和揭示模塊模式。閱讀我在JSFiddle上製作的這個fiddle的鏈接。我想你一定會很高興的。

看起來你正在試圖製作一個托盤對象,所以我爲你創建了一個new fiddle

下面是代碼:

function Pallet(palletName, palletColors) { 
    this.name = palletName; //name is now a property of Pallet 
    this.colors = palletColors; //colors is now a property of Pallet 
} 

Pallet.prototype.getColor = function(color) { 
    //access Pallet properties using the 'this' keyword 
    //ex. this.colors or this.name 
    if (this.colors.indexOf(color) > -1) { 
     return 'Color found'; //Or whatever you need to do. 
    } 

    return 'Color not found'; //Or whatever you need to do. 
}; 


var myPallet = new Pallet('myNewPallet', ['green', 'red', 'blue']); 
document.write(myPallet.getColor('red'));​ //using document.write for simplicity 
+0

「something()」中的變量版本背後的推理是什麼? – ThomasReggi

+0

我不想創建myPallet和myColors作爲Something對象的屬性,所以我只是將它們創建爲簡單變量。 '我'只是一個約定,我用它作爲我使用的對象的前綴。如果我對你的項目有更多的瞭解,我會讓這些名字更合適。例如,您可以將它們命名爲「colorCollection」或「colorPallet」。隨你便。 – elucid8

+0

/facepalm HAH!你的意思是我爲什麼要使用它們?他們只是在那裏保存傳遞給你的構造函數的值,以便可以通過getColors函數訪問它們。從技術上講,你可以自己訪問參數,但爲了這個例子我明確地給它們命名。 – elucid8

-1

避免使用new - 根據我的經驗,我發現工廠方法更強大。例如,你可以完成你通過這樣問:

function Something(pallet, colors) { 
    var that = {}; 

    that.foo = function (moreColors) { 
     // Here you can access pallet, colors, and moreColors. 
     // Use "that" to refer to the current object, not "this". 
    }; 

    return that; 
} 

x = Something(somePallet, ['blue', 'green', 'orange']); 
x.foo(['blue']); 
+2

你正將'foo'分配給'window' ......也不是很好。沒有理由*避免*使用'new'。也許你想'var that = {};'。 –

+0

是的,這就是我的意思,我已經修復它。我在自己的開發實踐中避免使用「新」,因爲這很容易導致您指出的原因出現重大問題;如果你忘記了'new',那麼你只能擊倒另一個物體。 – cdhowie

1
var Something = function(pallet, colors){ 
    this.try = function(arr){ 
     //stuff 
    } 
}; 

這是一個構造函數,它爲你描述你可以再使用。嘗試將有權訪問托盤和顏色。正如在評論中提到的那樣,嘗試不是一個很好的方法名稱,因爲它是一個保留字。