2016-04-06 2 views
1

Здесь у меня есть код, который использует getter и setter для определения и извлечения значения свойства. Я создал объект, используя конструктор объекта. Я передал объект в a для ... в метод loop.Also использовал getOwnPropertyNames() на object.Here результатыЧто такое свойство «OWN» в javascript

свойства "FULLNAME" доступно в течение ... в цикле

"FULLNAME" не виден в getOwnPropertyNames метода() . Это означает, что это

не является собственностью

Здесь у меня есть два основных вопроса. Что такое собственная собственность? Если «fullName» не является собственностью, то какой тип собственности это?

function Name(first, last) { 
    this.first = first; 
    this.last = last; 
} 

Name.prototype = { 
    get fullName() { 
     return this.first + " " + this.last; 
    }, 

    set fullName(name) { 
     var names = name.split(" "); 
     this.first = names[0]; 
     this.last = names[1]; 
    } 
}; 
var obj=new Name('al','zami'); 
for(var i in obj){ 
    console.log(i); // fullName is here 
} 
console.log(Object.getOwnPropertyNames(obj)); // fullName is not here 
+2

* «какой тип собственности это» * Некоторые сказали бы, что это «унаследованное» свойство. –

+1

[MDN: Перечисление и владение свойствами] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties) – Bergi

+0

@FelixKling: кто бы не стал? – Bergi

ответ

3

hasOwnProperty и getOwnPropertyNames относятся к свойствам присвоенных непосредственно к объекту, а не только быть доступным через цепочку прототипов объекта. Либо this.foo =, либо bar.foo = считать как собственное имущество, потому что вы назначаете экземпляр.

«Собственные свойства» определены в section 4.3.30 из спецификации, чтобы быть:

свойство, которое непосредственно содержится ее объекта

против с «унаследованной собственности» определен (4.3.31), как :

свойство объекта, который не является собственностью, но является свойством (собственным или унаследованным) прототипа объекта

То есть, собственное свойство принадлежит экземпляру, а не прототипу.

Наибольшее влияние имеют прототипические классы (конструкторы с некоторыми методами и/или статические свойства). В классических терминах OO getOwnPropertyNames пропустит методы класса и все, что имеет ключевое слово static.

Если вы посмотрите на спецификацию section 8.12.1, это косвенно исключает прототип. На шаге 3 среда выполнения проверяет собственные свойства объекта для соответствующего имени свойства. Однако в section 8.12.2 (ссылаясь на getProperty без «собственного» квалификатора), шаги № 3-4 описывают проверку прототипа объекта, если свойство не было найдено на самом объекте.

+1

Обратите внимание, что даже присваивание не может создать свойство, если унаследованный сеттер – Bergi

+0

@Bergi достаточно прав. Спасибо за редактирование. – ssube

+0

FWIW, http://www.ecma-international.org/ecma-262/6.0/index.html - текущая спецификация;) –

1

Object.getOwnPropertyNames возвращает имена свойств, которые находятся непосредственно на объекте. Например, если вы добавите новое свойство к объекту, используя obj.foo = 'bar';, тогда "foo" будет включен в объекта.fullName не является свойством непосредственно на obj, но это свойство этого объекта:

{ 
    get fullName() { 
     return this.first + " " + this.last; 
    }, 

    set fullName(name) { 
     var names = name.split(" "); 
     this.first = names[0]; 
     this.last = names[1]; 
    } 
} 

который бывает внутренний прототип obj:

Object.getOwnPropertyNames(Object.getPrototypeOf(obj)); // ["fullName"] 

В for ...in цикл повторяется через все перечислимы свойства в цепочке прототипов объектов, поэтому он будет включать эти свойства.

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