我有一个简单的数组:
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,那么它们也应该有一个getOwnProperty和一个setOwnProperty。
有什么建议吗?
发布于 2011-08-03 11:39:30
“我认为如果对象有一个
hasOwnProperty,那么它们也应该有一个getOwnProperty和一个setOwnProperty”
hasOwnProperty()函数告诉您命名的属性是否作为对象的直接属性存在,而不是从对象的原型链中的某个位置继承的属性。像if (someProperty in someObject) {}一样使用的in运算符将告诉您对象是否在原型链中的任何位置具有该属性。
您不需要相应的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);发布于 2011-08-03 11:19:29
您可以通过以下方式设置该值:
for(i = 0; i < arr.length; i++ ) {
if(!obj.hasOwnProperty(arr[i])) {
obj[arr[i]] = 'value';
}
}发布于 2011-08-03 11:43:49
无论是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
}祝你编码愉快。
https://stackoverflow.com/questions/6921258
复制相似问题