Javascript setattr или setOwnProperty - PullRequest
       0

Javascript setattr или setOwnProperty

3 голосов
/ 03 августа 2011

У меня есть простой массив:

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. В питоне я бы назвал setattr(obj,arr[i], value). Я полагал, что если объекты имеют hasOwnProperty, они также должны иметь getOwnProperty и setOwnProperty.

Любое руководство?

Ответы [ 5 ]

3 голосов
/ 03 августа 2011

"Я подумал, что если объекты имеют hasOwnProperty, они также должны иметь getOwnProperty и setOwnProperty "

Функция 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 голосов
/ 03 августа 2011

Ни 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
}

Удачного кодирования.

2 голосов
/ 03 августа 2011

Вы можете установить значение с помощью:

for(i = 0; i < arr.length; i++ ) {
        if(!obj.hasOwnProperty(arr[i])) {
                obj[arr[i]] = 'value';
        }
}
1 голос
/ 03 августа 2011

Я думаю, вы несколько усложняете это.Попробуйте это:

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

Вам не нужно использовать hasOwnProperty для массива при его итерации по его индексам.Хотя, возможно, вы хотели проверить против obj как защиту от перезаписи всего, что уже было установлено?

0 голосов
/ 03 августа 2011

Вы можете установить свойство с помощью:

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

В javascript доступ к свойству может быть сделан либо с помощью .name, либо ['name'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...