2016-03-17 1 views
0

Здесь я создал экземпляр родительского класса и определил свойство, называемое smile на самом объекте. Я знаю, что свойство, определенное в прототипе конструктора, не является собственностью объекта. Но как получилось, что свойство «smile» не прошло проверку hasOwnProperty внутри внутри цикла?Почему свойство, определенное после создания объекта, не является собственностью.

function Parent(){ 
    this.name='parent'; 
} 
Parent.prototype.age='34'; 

var p=new Parent(); 
p.smile='nice'; // not an own property ? 
console.log(p); 
for(var prop in p){ 
    if(Object.hasOwnProperty(prop)){ 
     console.log(prop); // prints only "name" 
    } 
} 

ответ

3
if (Object.hasOwnProperty(prop)) { 

Проверяет, если Object является собственностью данного объекта. Object.name существует на функции Object, поэтому он возвращает true.

Что вы хотитеp.hasOwnProperty(prop), так что вы проверяете, обладает ли этот экземпляр свойством, а не наследуется от прототипа. Тем не менее, вызов функции таким образом вызовет проблемы, если экземпляр имеет собственное свойство с именем hasOwnProperty, поэтому обычно просматривается расширенная форма:

Object.prototype.hasOwnProperty.call(p, prop) 
4

Вы неправильно используете Object.prototype.hasOwnProperty(). Эта функция должна быть вызвана с проверенным объектом в качестве ее контекста, что означает, что вы должны сделать p.hasOwnProperty(prop) вместо Object.hasOwnProperty(prop). Тогда вы получите результат, которого ожидаете.

hasOwnProperty определяется на Object.prototype, что означает, что большинство объектов (за исключением тех, для которых вы вручную установить прототип null) наследует метод, поэтому он может быть вызван на них. p - такой объект. В цепочке прототипов нет ничего необычного, поэтому он должен работать при изменении в соответствии с приведенным выше описанием.

Теперь вы можете спросить, почему ваш код не выдает ошибку в строке оператора if. Это потому, что Object является функцией и, следовательно, в конечном итоге наследуется от Object.prototype.

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