Определение объектов в Javascript - PullRequest
2 голосов
/ 02 марта 2012

Я хочу определить следующий объект в javascript:

var property = 'foo';
var value = 'bar';
var obj = {
    property: value;
}; 

Это приведет к следующему:

obj.property <-> 'bar';
obj.foo <-> undefined

Это нормально, но как определить объект для получения:

obj.foo = 'bar';

Возможное решение:

var obj = {};
obj[property] = value;

или

var obj = new Object();
obj[property] = value;

Но это не удобно, когда приходится определять объекты, такие как:

var obj = {
    o1: {
        oo1: {
            property: value;
        }
    }
};

Опять же, я хочу:

var property = 'foo';
var value = 'bar';
var obj = {
    property: value;
}; 
alert(obj.foo); // I want this to alert: 'bar'

Как вы справляетесь с подобными ситуациями?Спасибо!

Ответы [ 4 ]

2 голосов
/ 02 марта 2012

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

var property = 'foo';
var value = 'bar';
var obj = {val : window.value};//doesn't work for property id's
var obj[window.property] = obj.val;
alert(obj.foo);//alerts 'bar'

В качестве альтернативы,заставьте ваш конструктор принимать параметры:

function Foobar(prop,val)
{
    this[prop] = val;
}
var obj = new Foobar('foo','bar');
alert(obj.foo);//alerts 'bar'

Во втором примере вложенные объекты могут использовать аргументы, передаваемые их «родительскому» / содержащему объекту, например:

function Foobar(prop,val)
{
    Foobar.prop = prop;
    Foobar.val = val;
    ...
    this.subObj = {};
    this.subObj[Foobar.prop] = Foobar.val;//var prop from scope Foobar, same as window
}

Использование преимуществтот факт, что переменные функций или объектов могут быть сделаны статическими, вы можете даже сделать что-то вроде этого:

Foobar.prop = (typeof Foobar.prop !== 'undefined' ? Foobar.prop : prop);
//or
Foobar.subObj=  {new Foobar};//extending parent object
Foobar.subObj.newProp = 'newVal';
1 голос
/ 02 марта 2012

Кажется, вам нужен псевдоним.

Если я правильно понимаю, вы хотите сделать следующее:

var obj = {something: 'bar'};
alert(obj.foo); // alerts 'bar'

Для этого определите геттер.Это проще всего с прототипом:

function Factory() {
}
Factory.prototype = {
    get foo() {
        return this.something;
    }
};

var obj = new Factory;
obj.something = 'bar';
alert(obj.foo); // alerts 'bar'

Прототип - это в основном модель для объекта.Когда вы создаете новую Фабрику, у получающегося объекта есть получатель 'что-то', которое возвращает значение foo.Это немного грязный синтаксис, но он работает для того, что вы хотите.

Кроме того, вы можете полностью отказаться от прототипа и сделать это:

var obj = {};
obj.__defineGetter__('foo', function () { return this.something; });
obj.something = 'bar';
alert(obj.foo); // alerts 'bar'

То же самое можно сделать с __defineSetter.Это синтаксис ES5, который работает не во всех браузерах (IE), но должен работать в более новых браузерах.

См. блог Джона Ресига для получения дополнительной информации.

1 голос
/ 02 марта 2012

Единственный способ сделать это в JavaScript - использовать скобки:

var property = 'foo',
    value = 'bar',
    obj = {};

obj[property] = value;

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

0 голосов
/ 07 ноября 2014

Я бы порекомендовал https://github.com/leecrossley/dotject

Вы можете создавать объекты с помощью:

dotject("a,b.c");

Делает:

{
  "a": {},
  "b": {
    "c": {}
  }
}

Или более реальный пример:

var camera = {isEnabled: true};
camera = dotject("settings.encoding.format,output.data.base64", camera, "JPEG", true);

{
  "isEnabled": true,
  "settings": {
    "encoding": {
      "format": "JPEG"
    }
  },
  "output": {
    "data": {
      "base64": true
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...