наследование свойств от Object
Может сможет кто помочь?
Хочу задать для Object свойство propertyName (это переменная, может принимать любое значение), чтобы все наследники получили доступ к этому свойству. Потом для наследника Object - object пытаюсь изменить значение этого свойства, но вместо этого создается новое свойство для object. const createNotEnumerableProperty = () => { Object.defineProperty(Object.prototype, propertyName, { enumerable: true, configurable: true, writable: true, value: 'empty'}); return propertyName; } Вот код в html: </head> <body> <script src="final.js"></script> <script> const propertyName = 'property'; const propertyValue = 'value'; const property = createNotEnumerableProperty(propertyName); const object = {}; object[property] = propertyValue; </script> </body> </html> Буду рада любым мыслям по этому поводу) |
мне нужно, чтобы
object[property] = propertyValue;изменило значение свойства Object, а вместо этого создается новое свойство объекта object :-E |
Интересно... Унаследованное свойство есть, имеет значение, а объект пустой
const createNotEnumerableProperty = () => { Object.defineProperty(Object.prototype, propertyName, { enumerable: true, configurable: true, writable: true, value: 'empty'}); return propertyName; } const propertyName = 'property'; const propertyValue = 'value'; const prop = createNotEnumerableProperty(propertyName); alert(prop); const object = {}; alert(object.property); alert(object[prop]); alert(JSON.stringify(object)); // object.property = propertyValue; // alert(JSON.stringify(object)); |
Сделал свойство неперечисляемым через специальную функцию а потом удивляешься куда оно делось =).
https://developer.mozilla.org/ru/doc..._of_properties вдруг кому поможет. |
да, мне и нужно сделать так, чтобы свойство было неперечисляемым(
|
MallSerg, задача в том, чтобы можно было создать объект и присвоить значение неперечисляемому, наследумому от Object свойству
|
MallSerg,
А у меня вместо того, чтобы присвоить значение наследуемому свойству, создается новое свойство( |
Объект и его прототип это два разных объекта.
Проблема в том что к свойствам одного из этих объектов можно обратится с помощью наследования. Просто нужно вспомнить как ищется свойство у объекта. т.е. «object.property» и «object.__proto__.property» это два разных свойства у двух разных объектов. просто при вызове object.property создается новое свойство которое перекрывает свойство прототипа. По хорошему нужно сохранить ссылку на свойство в переменной и работать через него или же напрямую работать с Object.property вместо object.property у Dilettante_Pro все перечисляемое просто невнимательно посмотрел на свойства =). |
MallSerg,
Да, спасибо, все верно) Только почему тогда даже такой код не работает: const createNotEnumerableProperty = () => { Object.defineProperty(Object.prototype, propertyName, { enumerable: true, configurable: true, writable: true, value: 'empty'}); return '__proto__.property'; } Просто для моего задания важно сохранить структуру записи object[property] = propertyValue; |
MallSerg,
опять же создается новое свойство object.__proto__.property, которое не сохраняет атрибуты свойства объекта Object |
Не совсем понял что значит не сохраняет?
<script> s = ""; s+= "A = {} -------------------------> "+ eval("A = {}") +"<br>"; s+= "A.__proto__.test = AAA ------> "+ eval('A.__proto__.test = "AAA"') +"<br>"; s+= "B = {} -------------------------> "+ eval("B = {}")+"<br>"; s+= "B.test --------------------------> "+eval("B.test")+"<br>"; s+= "B.test = 321 -------------------> "+eval("B.test = 321") +"<br>"; s+= "B.__proto__.test --------------> "+ eval("B.__proto__.test") +"<br>"; s+= "B.__proto__.test = BBB ------> "+ eval("B.__proto__.test = 'BBB'") +"<br>"; s+= "A.__proto__.test --------------> "+ eval("A.__proto__.test") +"<br>"; s+= "A.test ---------------------------> "+ eval("A.test") +"<br>"; s+= "B.test ---------------------------> "+ eval("B.test") +"<br>"; document.write(s) </script> Совсем непонятно зачем это нужно. Если хочешь отловить обращение к несуществующим свойствам смотри в с торону https://learn.javascript.ru/proxy |
375291601334,
Прототипное наследование - прототипное. При обращении к свойству объекта - оное ищется сначала в самом объекте, потом в прототипе родителя, потом в прототипе родителя родителя итд. И устанавливается свойство по умолчанию тоже прямо в текущий объект. Всё очень просто и прямо. Надо изменить свойство в родителе - вот в прямо прототипе родителя его и изменяй.) Ну или можно воспользоваться кривой современной реализацией классов и словом "super". Ещё в качестве костыля - можно это твоё propertyName сделать геттером/сеттером и, соответственно, уже там менять нужное значение. |
Aetae,
спасибо) про геттер/сеттер крутая мысль, надо попробовать |
Aetae,
Вот таким образом все получилось: const createNotEnumerableProperty = () => { Object.defineProperty(Object.prototype, propertyName, { get: function() { return result; }, set: function(value) { result = value; }, enumerable: true, configurable: true }); return propertyName; }; Спасибо всем огромное! |
Часовой пояс GMT +3, время: 07:51. |