2016-01-26 2 views
3

Я хочу проверить экземпляр класса JavaScript и получить доступ к его получателю. В ES5, я могу написать этот код retrieve the getter объекта:Не удается получить дескриптор свойства свойства класса

var obj = { 
    get foo() {} 
}; 

const foo = Object.getOwnPropertyDescriptor (obj, 'foo').get; 
// returns a function 

Однако, когда я пытаюсь это на экземпляр класса, мой код не:

class Foo { 
    get foo() {} 
} 

var obj = new Foo(); 
const foo = Object.getOwnPropertyDescriptor (obj, 'foo').get; 
// error: Cannot read property 'get' of undefined 

Object.getOwnPropertyDescriptor не похоже на работу: он возвращает undefined для foo.

Я использую Babel 6.4.5 для перевода моего кода с ES2015 на ES5.

Is Object.getOwnPropertyDescriptor Предполагается также работать над классами? Или это побочный эффект от использования Вавилона?


EDIT Я, наконец, перешел на Object.getOwnPropertyDescriptor как предложено по Берги. Подробно описываю решение в таблице blog post (Enumerating methods on a JavaScript class instance).

+0

Примеры совершенно разные. В первом примере создается объект, который имеет «foo» getter, второй создает объект с прототипом, который имеет «foo» getter. – zeroflagL

+0

А, да. Я это изучил! Я все еще хочу понять, как классы ES6 сопоставляются с ES5. –

+0

* «Мне все еще нужно понять, как классы ES6 сопоставляются с ES5» * 'class Foo {constructor() {/ * constructor * /} method() {}}', (почти) так же, как и 'function Foo() {/ * constructor * /} Foo.prototype.method = function() {};', за исключением того, что методы не перечислены. –

ответ

6

Он действительно работает с классами, но экземпляр вы пробовали его на не имеет собственный собственности. Использовать

Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'foo') 
Object.getOwnPropertyDescriptor(Foo.prototype, 'foo') 
+0

Спасибо. Как я могу определить свойство _own_ в экземпляре класса? –

+0

С Babel, 'Object.getOwnPropertyDescriptor (Object.getPrototypeOf (obj), 'foo'). Get.name' равно' get', а не 'foo' ... –

+0

Использовать' this.foo = ... 'внутри конструктор. Или 'Object.defineProperty' для сеттеров/геттеров. – Bergi

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