2015-08-24 3 views
2

Может ли кто-нибудь сказать мне, почему «hasOwnProperty» является ложным в приведенном ниже примере, тогда как getOwnPropertyDescriptor не является нулевым ?.Почему hasOwnProperty (o, «dummy») является «false» после defineProperty (o, «dummy»)

По MDN:

  • defineProperty() - ... определяет новое свойство непосредственно на объекте ...

  • hasOwnProperty() - ... Этот метод может быть использован для определения является ли объект имеет указанное свойство как прямое свойство этого объекта ...

  • getOwnPropertyDescriptor() - ... возвращает собственный дескриптор свойства ...

http://jsfiddle.net/rr55tukb/

var _g = {}; 

Object.defineProperty(_g, "dummy", { 
    get: function() { 
     return 1 
    }, 
    set: function() {}, 
    enumerable: true 
}); 

var hasOwnProperty = Object.hasOwnProperty(_g, "dummy"); 
var getOwnPropertyDescriptor = JSON.stringify(Object.getOwnPropertyDescriptor(_g, "dummy")); 

Выход:

hasOwnProperty=false 
getOwnPropertyDescriptor={"enumerable":true,"configurable":false} 

ответ

2

hasOwnProperty является свойством самого объекта. Вы проверяете, если Object объект обладает этим свойством, если не _g объект делает:

var hasOwnProperty = _g.hasOwnProperty("dummy"); 

Или:

Object.prototype.hasOwnProperty.call(_g, 'dummy') 

Это позже безопаснее, так как _g может технически перекрыть hasOwnProperty собственности.

+0

Прохладный, эта второстепенная вещь была упущена :(Был путать этот странный дизайн ES5 - getOwnPropertyDescriptor() является членом класса, а hasOwnProperty() - это экземпляр. –

0

Ваш синтаксис hasOwnProperty неправильно. Вы вызываете его на Object и называете его двумя параметрами, поэтому он в основном ищет _g как собственность на Object.

Попробуйте так:

var hasOwnProperty = _g.hasOwnProperty("dummy");