2015-07-31 3 views
0

Имея этот кодДоступ к внутренним полям объекта в Js

var a = {date : 12}; 
for(var t in a){ 
    alert(t); 
} 

У меня есть одно предупреждение с датой собственности.

Но везде (то есть here) я вижу, что это необходимо, чтобы написать:

for (var property in object) { 
    if (object.hasOwnProperty(property)) { 
     // do stuff 
    } 
} 

Так почему я не вижу внутренних свойств объекта?

+0

Что вы подразумеваете под «внутренними свойствами». В последнем примере вы просто делаете краевой тест, если свойство, которое вы ищете, действительно существует в «вашем объекте». – fubbe

+0

Какие внутренние свойства вы хотите увидеть? –

+1

Op говорит _ «почему требуется использовать' hasOwnProperty', потому что я не вижу внутренних реквизитов, даже я не использовал 'hasOwnProperty', так зачем мне это нужно?» _ IMHO –

ответ

0

Синтаксис for..in выполняет итерацию каждого свойства объекта, в том числе найденного в цепочке прототипов (если они перечислены). Обычно это не то, что вы хотите, поэтому обычно рекомендуется проверка hasOwnProperty.

В вашем случае это не нужно, так как ваш обычный объект не наследует никаких перечислимых свойств от прототипа объекта (единственное, что в своей цепи прототипов)

Кроме того, for..in дает свойство имена (ключи) объекта, если вы заинтересованы в стоимости конкретного имущества, вы должны использовать кронштейн обозначения, продлив пример этому:

var a = {date : 12}; 
for(var t in a){ 
    alert(a[t]); 
} 
+0

Что касается системных полей для каждого объекта js? isPrototypeOf, конструктор, __defineGetter__? Разве я не должен их видеть? –

+1

Что значит «нужно их видеть»? Они не перечислимы, поэтому они не будут отображаться, когда вы делаете для итерации, с или без проверки hasOwnProperty.Но вы * можете * ссылаться на них напрямую, если вам нужно. – doldt

0

В JavaScript существует «цепочка прототипов», форма наследования. Если вы хотите добавить свойство к прототипу a, а затем добавить свой объект date прямо на a, ваш цикл for найдет оба этих объекта.

hasOwnProperty проверяет, привязано ли текущее свойство непосредственно к объекту контекста или было ли оно унаследовано через цепочку прототипов.

Так в моем примере, если вы имели добавил свойство прототипа a «s, условие hasOwnProperty возвратит ложь, и вы бы не„делать вещи“с ним.

0

Я думаю, что лучший способ, чтобы увидеть это пример:

Object.prototype.aBaseProperty = 123; 

var childObject = { date: 12 }; 

for (var property in childObject) { 
    console.log(property) 
} 

// output: date aBaseProperty 


for (var property in childObject) { 
    if (childObject.hasOwnProperty(property)) { 
     console.log(property) 
    } 
} 

// output: date 
0

Кроме того, вместо того, чтобы делать hasOwnProperty чек, вы можете предпочесть

Object.keys(object).forEach(function(value, key) { ... }); 

Где Object.keys будет возвращать только собственные свойства.

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