2015-09-05 2 views
0

Если я не разрешить записи в свойство объекта является его достаточно определить только поглотитель, как это:Как запретить изменение свойств объекта с геттером

Object.defineProperty(fileNavigator, "isRoot", { 
    get: function() { 
     return this.currentPath.length === 0; 
    }.bind(this) 
}); 

var r = fileNavigator.isRoot; 

// работает OK

fileNavigator.isRoot = 4; 

// бросает

TypeError: Cannot set property isRoot of #<Object> which has only a getter 

который, как ожидается. Мне интересно, так ли это должно быть сделано?

+2

Да, если вы хотите свойство, отличное от записи, ожидается, что распределение присваивается - и так оно и делается, да. – Bergi

+0

@Shadow: это не имеет ничего общего с ES6 –

ответ

2

Если вы хотите свойство быть пересчитаны каждый раз, когда вы получаете его, что это ваш случай, то да, что вы сделали это просто отлично, для .bind(this), который ненужно и неправильно за исключением (спасибо @torazaburo) , Если вы абсолютно хотите связать функцию, вам нужно использовать .bind(fileNavigator), иначе значение this почти наверняка не будет fileNavigator, как и предполагалось.

Если вы хотите, чтобы свойство считалось постоянным константой, вам не нужна функция getter, так как ему не нужно было что-либо вычислять. Вместо этого вы используете другой тип дескриптора свойства:

Object.defineProperty(obj, 'propertyName', { 
    value: 'myValue', 
    writable: false, 
    enumerable: true, 
    configurable: false 
}); 
+0

спасибо, upvoted, будет ждать других ответов –

+0

* другой дескриптор свойств * называется ** описателем данных **. Кстати, 'bind (this)' не просто лишний, я уверен, что это неправильно и вызовет сбой кода. –

+0

@torazaburo Не уверен, где вы получили этот «дескриптор данных» именования ... http://www.ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type Кроме того, вы прямо о '.bind (this)', я этого не видел, спасибо. – jrsala

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