javascript Object - получить доступ к дочернему свойству, используя точечную запись - PullRequest
0 голосов
/ 29 сентября 2018

Я создал объект, который требует, чтобы объект словаря был передан для инициализации, и имеет атрибуты (например, length).Я хотел бы иметь возможность просто получить доступ к паре key : value словаря, передавая что-то вроде:

myNewObj['a'] или myNewObj.a

и не , что необходимовместо этого передайте myNewObj.dictionary['a'], но не можете понять, как это сделать.

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

var newObject = function(dictionary) {
    this.dictionary     = dictionary;
    this.length         = dictionary[[Object.keys(dictionary)[0]]].length;

    this.get = function (column) {
        return this.dictionary[[column]];
    }
};

var myNewObj = new newObject({
    a   : [1,2,3],
    b   : [4,5,6]
});

console.log(myNewObj.get('a'));

Я обновил его, чтобы показать метод .get(), который работает, но он все еще не совсем то, что я ищу.

jsFiddle: http://jsfiddle.net/2uMjv/571/

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Почему бы вам просто не установить свойства?:

 class Dictionary {
  constructor(dictionary) {
   Object.assign(this, dictionary);
  }

  get length() {
    return Object.keys(this).length;
  }

  get(column) {
    return this[column];
  }
}

var dict = new Dictionary({
  a   : [1,2,3],
  b   : [4,5,6]
});

console.log(dict.a, dict["a"], dict.get("a"));
0 голосов
/ 30 сентября 2018

Хотя это может не совсем соответствовать вашему случаю использования динамических атрибутов, самое близкое, что я могу придумать, это расширение прототипа.По крайней мере, используя Object.setPrototypeOf*, вы можете избежать определения каждого метода в отдельности и иметь базовый набор функций для применения к каждому из этих newObject.

var newObject = function(dictionary) {
    this.dictionary = dictionary;
    this.length = dictionary[[Object.keys(dictionary)[0]]].length;

    this.get = function(column) {
        return this.dictionary[[column]];
    }
};

// Essentially a wrapper constructor.
var createNewObject = function(dictionary) {
    Object.setPrototypeOf(dictionary, new newObject(dictionary));
    return dictionary;
}

var myNewObj = createNewObject({
    a   : [1,2,3],
    b   : [4,5,6]
});

console.log(myNewObj['a']);
console.log(myNewObj.get('b'));

* Вы можетехочу посмотреть на потенциальные недостатки в использовании этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...