Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   наследование свойств от Object (https://javascript.ru/forum/misc/72899-nasledovanie-svojjstv-ot-object.html)

375291601334 05.03.2018 16:44

наследование свойств от 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>


Буду рада любым мыслям по этому поводу)

375291601334 05.03.2018 16:52

мне нужно, чтобы
object[property] = propertyValue;
изменило значение свойства Object, а вместо этого создается новое свойство объекта object :-E

Dilettante_Pro 05.03.2018 18:23

Интересно... Унаследованное свойство есть, имеет значение, а объект пустой
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));

MallSerg 05.03.2018 18:51

Сделал свойство неперечисляемым через специальную функцию а потом удивляешься куда оно делось =).

https://developer.mozilla.org/ru/doc..._of_properties вдруг кому поможет.

375291601334 05.03.2018 19:59

да, мне и нужно сделать так, чтобы свойство было неперечисляемым(

375291601334 05.03.2018 20:01

MallSerg, задача в том, чтобы можно было создать объект и присвоить значение неперечисляемому, наследумому от Object свойству

375291601334 05.03.2018 20:02

MallSerg,
А у меня вместо того, чтобы присвоить значение наследуемому свойству, создается новое свойство(

MallSerg 05.03.2018 22:27

Объект и его прототип это два разных объекта.
Проблема в том что к свойствам одного из этих объектов можно обратится с помощью наследования.
Просто нужно вспомнить как ищется свойство у объекта.

т.е. «object.property» и «object.__proto__.property» это два разных свойства у двух разных объектов.
просто при вызове object.property создается новое свойство которое перекрывает свойство прототипа.
По хорошему нужно сохранить ссылку на свойство в переменной и работать через него или же напрямую работать с
Object.property вместо object.property

у Dilettante_Pro все перечисляемое просто невнимательно посмотрел на свойства =).

375291601334 05.03.2018 22:38

MallSerg,
Да, спасибо, все верно)
Только почему тогда даже такой код не работает:

const createNotEnumerableProperty = () => {
Object.defineProperty(Object.prototype, propertyName, {
  enumerable: true,
  configurable: true,
  writable: true,
  value: 'empty'});
return '__proto__.property';  }


Просто для моего задания важно сохранить структуру записи object[property] = propertyValue;

375291601334 05.03.2018 22:40

MallSerg,
опять же создается новое свойство object.__proto__.property, которое не сохраняет атрибуты свойства объекта Object

MallSerg 05.03.2018 23:53

Не совсем понял что значит не сохраняет?
<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

Aetae 06.03.2018 01:23

375291601334,
Прототипное наследование - прототипное. При обращении к свойству объекта - оное ищется сначала в самом объекте, потом в прототипе родителя, потом в прототипе родителя родителя итд. И устанавливается свойство по умолчанию тоже прямо в текущий объект. Всё очень просто и прямо. Надо изменить свойство в родителе - вот в прямо прототипе родителя его и изменяй.)
Ну или можно воспользоваться кривой современной реализацией классов и словом "super".

Ещё в качестве костыля - можно это твоё propertyName сделать геттером/сеттером и, соответственно, уже там менять нужное значение.

375291601334 06.03.2018 10:14

Aetae,
спасибо) про геттер/сеттер крутая мысль, надо попробовать

375291601334 06.03.2018 10:49

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.