2011-08-03 74 views
3

我有一個簡單的數組:的Javascript SETATTR或setOwnProperty

var arr = ['has_cats', 'has_dogs']; 

和對象:

var obj = new Object(); 

和從我想設置對象陣列屬性:

for(i=0; i < arr.length; i++) { 
     if(!arr.hasOwnProperty(arr[i])) { 
       // set the object property 
     } 
} 

後循環我應該能夠呼叫obj.has_cats,但我似乎無法找到一個正確的方法來做到這一點在JavaScript中。在python中,我會打電話給setattr(obj,arr[i], value)。我認爲如果對象有hasOwnProperty,他們也應該有getOwnPropertysetOwnProperty

任何指導?

回答

3

「我認爲,如果對象有一個hasOwnProperty他們也應該有 一個getOwnPropertysetOwnProperty

hasOwnProperty()函數告訴你命名的屬性是否存在爲對象的直接屬性,與從對象的原型鏈中某處繼承的屬性相比。 in運算符(如if (someProperty in someObject) {})會告訴您該對象是否在原型鏈中的任何位置具有該屬性。

你並不需要一個相應的setOwnProperty()功能,因爲你可以說:

someObject[someProperty] = someValue; 

我猜相應getOwnProperty()功能的想法那種有道理的,如果你想有一個函數,只返回一個值指定的屬性是直接屬性,但是如果找到屬性,則無法指示指定的屬性未找到,因爲null,undefined,false等都是合法的潛在值。所以爲了達到這個目標,你需要使用if (hasOwnProperty())作爲一個兩步過程。

但這聽起來不像你想要做的那樣。如果我正確理解你,你只需要一些方法來設置屬性名稱在變量中的屬性(在你的情況下,一個數組元素)。你沒有說清楚你想要哪些值與這些屬性相關聯,所以我只使用true

var arr = ['has_cats', 'has_dogs']; 

var obj = {}; // note {} is generally preferred to new Object(); 

for(var i=0; i < arr.length; i++) { 
    // if the property doesn't already exist directly on 
    // the object 
    if(!obj.hasOwnProperty(arr[i])) { 
    // set the object property 
    obj[arr[i]] = true; 
    } 
} 

// can access with bracket notation 
alert(obj["has_cats"]); 

// can access with dot notation 
alert(obj.has_cats); 
2

您可以通過設定值:

obj[arr[i]] = "my value"; 

在JavaScript屬性訪問可以通過.name['name']被要麼完成了:

for(i = 0; i < arr.length; i++) { 
     if(!obj.hasOwnProperty(arr[i])) { 
       obj[arr[i]] = 'value'; 
     } 
} 
+1

毆打我10秒:( – karim79

+0

發生在我身上;) – mikeycgto

+0

投了你的答案,但選擇了另一個努力。謝謝你們的迴應。 –

0

您可以設置該屬性。

1

我認爲你有些過於複雜。試試這個:

var arr = ['has_cats', 'has_dogs']; 
var obj = new Object(); 
for(i=0; i < arr.length; i++) { 
    obj[arr[i]] = true; 
} 

你不需要它的指數進行遍歷時,它使用hasOwnProperty對數組。雖然也許你打算檢查obj作爲防止覆蓋已經設置的任何東西的防範措施?

2

既不getOwnProperty也不setOwnProperty將增加的任何值:

總是設置從x評估的對象的屬性以下。因此,setOwnProperty只不過是屬性分配。

x[prop] = v 

同樣地,使用的hasOwnProperty和屬性存在的組合,能夠獲得(並取代)getOwnProperty

if (x.hasOwnProperty(prop)) { 
    // x has prop 
    // x[prop] may evaluate to undefined 
} else if (prop in x) { 
    // prop resolved through [[prototype]] chain 
    // x[prop] may evaluate to undefined 
} else { 
    // property prop not set 
    // x[prop] will evaluate to undefined 
} 

編碼愉快。

+0

+1 - 你用四句話來說,在我的回答中說了四段話。很好的清晰的代碼示例。 – nnnnnn

相關問題