我從來沒有涉足這樣的JavaScript對象,但我認爲我有一個很好的理由。創建一個共享變量的對象
這是我的例子:我想打,設置了兩個變量貨盤和顏色數組對象
x = new Something(pallet,['blue','green','orange']);
x.try(['blue']);
。
然後在try函數中,我想傳遞一個數組,但在函數中我想訪問pallet
和顏色對象。有人能告訴我這是否可能嗎?也許是一個小演示或教程?
我從來沒有涉足這樣的JavaScript對象,但我認爲我有一個很好的理由。創建一個共享變量的對象
這是我的例子:我想打,設置了兩個變量貨盤和顏色數組對象
x = new Something(pallet,['blue','green','orange']);
x.try(['blue']);
。
然後在try函數中,我想傳遞一個數組,但在函數中我想訪問pallet
和顏色對象。有人能告訴我這是否可能嗎?也許是一個小演示或教程?
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函數來實例化對象的東西的人。您可以閱讀關於關閉here和here。不過,基本上,您正在關閉顏色和托盤成員,並且由於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
「something()」中的變量版本背後的推理是什麼? – ThomasReggi
我不想創建myPallet和myColors作爲Something對象的屬性,所以我只是將它們創建爲簡單變量。 '我'只是一個約定,我用它作爲我使用的對象的前綴。如果我對你的項目有更多的瞭解,我會讓這些名字更合適。例如,您可以將它們命名爲「colorCollection」或「colorPallet」。隨你便。 – elucid8
/facepalm HAH!你的意思是我爲什麼要使用它們?他們只是在那裏保存傳遞給你的構造函數的值,以便可以通過getColors函數訪問它們。從技術上講,你可以自己訪問參數,但爲了這個例子我明確地給它們命名。 – elucid8
避免使用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']);
你正將'foo'分配給'window' ......也不是很好。沒有理由*避免*使用'new'。也許你想'var that = {};'。 –
是的,這就是我的意思,我已經修復它。我在自己的開發實踐中避免使用「新」,因爲這很容易導致您指出的原因出現重大問題;如果你忘記了'new',那麼你只能擊倒另一個物體。 – cdhowie
var Something = function(pallet, colors){
this.try = function(arr){
//stuff
}
};
這是一個構造函數,它爲你描述你可以再使用。嘗試將有權訪問托盤和顏色。正如在評論中提到的那樣,嘗試不是一個很好的方法名稱,因爲它是一個保留字。
'try'是JavaScript關鍵字。不要將其用作屬性名稱。 :) – cdhowie
可能重複的[你如何在JavaScript中定義一個OOP類?](http://stackoverflow.com/questions/2221401/how-do-you-define-an-oop-class-in-javascript) –
@cdhowie嗯,作爲使用方括號的屬性名稱很好,並且在IE9 /任何其他格式中都可以。 – gsnedders