2013-07-13 4 views
1

Я смотрел на функции объекта Клон здесь:итерация объект и hasownproperty

http://jsperf.com/cloning-an-object/2

функция является:

function clone(obj) { 
    var target = {}; 
    for (var i in obj) { 
     if (obj.hasOwnProperty(i)) { 
      target[i] = obj[i]; 
     } 
    } 
    return target; 
} 

и я задавался вопросом, почему проверка

if (obj.hasOwnProperty(i)) 

Необходимо?

Потому что если свойство я не в объекте OBJ, было бы не повторяться, в первую очередь в для цикла.

Я что-то упустил?

+4

Может быть унаследован от прототипа. – Tim

ответ

3

Конструкция for...in также пересекает унаследованные свойства.

Если вы создаете объект с конструктором, например, так:

var s = new String(); 

тогда у вас есть все перечисляемые String функции, перечисленные среди свойств, но не как собственные свойства (т.е. прямых свойств). Например попробовать это в консоли:

for (var k in s) console.log(k) 

Вы обнаружите несколько интересных функций, которые, вероятно, были необходимы для SO разработчики как formatUnicorn.

Эта проверка позволяет клонировать прямые перечислимые свойства без клонирования свойств прототипа.

См. documentation on the MDN.

+1

umm ... все * перечислимые * функции. Кого там мало. –

+0

@JanDvorak Каждая добавленная вами функция перечислима, иногда - особенно в старых реализациях, которые вы, возможно, захотите использовать hasOwnPropertyName для фильтрации объектов на прототипе. –

+0

@BenjaminGruenbaum yep, но большинство функций уже существует и, следовательно, не перечислимо. Определенно не перечислены все функции String. –

1

Поскольку исходный цикл также отображает свойства объекта-прототипа, который вам не нужен.

1

Стоит отметить, что по состоянию на 1.8.5 JavaScript вы можете использовать Object.keys(obj), чтобы получить массив свойств, определенных на самом объекте (те, которые возвращают верно для obj.hasOwnProperty(key)).

Это лучше (и доступно для чтения), чем при использовании встроенного контура.

поддерживаемых на этих браузеров:

  • Firefox (Gecko): 4 (2,0)
  • Chrome: 5
  • Internet Explorer: 9

Более подробную информацию о https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Смежные вопросы