Доступ javascript к неизвестным свойствам объекта

Ситуация:

У меня есть несколько JS-объектов с одинаковой структурой.

Во всех этих объектах есть свойство, называемое console.

Я хотел бы присвоить значение (одно и то же) каждому из этих свойств.

Пожалуйста, найдите ниже состав моего кода:

NameOfMyObject = function() {

     return {

        actions: null,

        console: null,

        init: function() {}, 

        //object specific functions

    }
};

Моя проблема:

В настоящее время я назначаю значение вручную, но я хочу сделать его универсальным.

Фрагмент кода

this.console = console;
this.actions.console = console;
this.fixtures.console = console;

Как я могу получить доступ к свойствам моих объектов?

Надеюсь, я задал свой вопрос достаточно ясно.

this.console = this.actions.console = this.fixtures.console = console
Robby Cornelissen 10.09.2018 09:50

Не могли бы вы предоставить рабочий код? В нынешнем виде this.actions.console = console; выдаст исключение.

trincot 10.09.2018 09:51

Вы можете подробнее рассказать о том, что пытаетесь сделать?

Chris Li 10.09.2018 09:53

Этот код работает. init похож на конструктор.

user9026111 10.09.2018 09:55

@Chris Li Я бы хотел сделать что-нибудь вроде этого object.property.console = console;

user9026111 10.09.2018 09:55
init - пустой блок. console - это null, поэтому вы не можете назначать ему свойства. Этот код не работает, как указано в вопросе. В нем отсутствует хоть какой-то необходимый код.
trincot 10.09.2018 09:57

вы хотите запустить init и присвоить объекту значения?

Chris Li 10.09.2018 09:58

Предоставление всего того, что я мог, вышло бы за рамки возможного. Я попытался объяснить, что это за структура.

user9026111 10.09.2018 09:58

Ваш вопрос в том, что вы хотите, чтобы несколько объектов совместно использовали одно свойство, чтобы, если оно было изменено через один объект, оно также отражалось при просмотре через другой объект?

trincot 10.09.2018 09:58

@Chris Li Да, но общий, потому что в настоящее время я назначаю его вручную.

user9026111 10.09.2018 09:59

@trincot Да, это могло бы хорошо объяснить это.

user9026111 10.09.2018 10:00

звучит так, будто вам нужно использовать прототип

Chris Li 10.09.2018 10:00

Пожалуйста, не заставляйте людей больше работать, вандализируя ваши сообщения. Размещая сообщения в сети Stack Exchange (SE), вы предоставляете SE безотзывное право в соответствии с Лицензия CC BY-SA 3.0 на распространение этого контента (т.е. независимо от вашего будущего выбора). Согласно политике SE, распространяется не вандализированная версия сообщения. Таким образом, любой вандализм будет пресечен. Если вы хотите узнать больше об удалении сообщения, см .: Как работает удаление? ...

Makyen 21.09.2018 08:08
0
13
197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как вы бы делили свойство между объектами:

function MyClass() {};

MyClass.prototype.console = {}; // Define a "common" property on the prototype

var obj1 = new MyClass(); // Create two instances
var obj2 = new MyClass();

Object.getPrototypeOf(obj1).console.id = 13; // Assign a value once...
console.log(obj1.console.id); // ... and it exists on both instances
console.log(obj2.console.id);

Общее свойство находится в объекте-прототипе.

Вместо Object.getPrototypeOf(obj1) вы, конечно, можете использовать MyClass.prototype, поскольку вы знаете, что obj1 был создан MyClass. Они дают один и тот же объект-прототип.

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

Итак, это работает:

function MyClass() {};

MyClass.prototype.console = {}; // Define a "common" property on the prototype

var obj1 = new MyClass(); // Create two instances
var obj2 = new MyClass();

obj1.console.id = 13; // Assign a value once... (getting console from the prototype)
console.log(obj1.console.id); // ... and it exists on both instances
console.log(obj2.console.id);

Но если вы измените сам console, вы установите его в экземпляре, а не в прототипе:

function MyClass() {};

MyClass.prototype.console = {}; // Define a "common" property on the prototype

var obj1 = new MyClass(); // Create two instances
var obj2 = new MyClass();

obj1.console = { id: 13}; // Setting an instance property now
console.log(obj1.console.id); // ... and it does not exist on both instances
console.log(obj2.console.id); // == undefined

Поэтому, если такое назначение все еще должно работать на прототипе, вам нужно использовать первый блок кода с Object.getPrototypeOf или MyClass.prototype.

Другие вопросы по теме