Я пытаюсь установить перечислимое свойство с установщиком на прототипе объекта. Установка перечислимого свойства на прототипе объекта
function Foo(){}
Object.defineProperty(Foo.prototype, 'tag', {
enumerable: true, configurable: true,
set: function(x){
if(typeof(x) == "string") {
Object.defineProperty(this, 'tag', {value: x});
}
}
});
var bar = new Foo();
bar.tag = 7; console.log(bar.tag); // undefined
bar.tag = "baz"; console.log(bar.tag); // "baz"
console.log(bar); // {}
console.log(bar.propertyIsEnumerable('tag')); // false
Все работает, как ожидалось, за исключением двух последних строки.
Я только что протестировал код в узле v0.10.25. Я не понимаю, почему тег свойства не перечислим.
Как обходной путь, я использую Object.defineProperty в конструкторе против this
вместо Foo.prototype
, но я хотел бы понять, почему объект в javascript не может наследовать от enuerable свойств.
Нет, прототип может быть установлен с чем угодно. Вы можете использовать defineProperty, defineProperties или Object.create, чтобы установить значение прототипа. – HMR