Javascript Object Literal Notation - Создание миксинов (вроде) - PullRequest
1 голос
/ 05 апреля 2011

Из-за отсутствия лучшего заголовка ... Возможно ли сделать что-то подобное в JSON?

var obj = {
            a : 'a constant',
            b : a + ' and b constant'
}

Обновление: Не работает - this.a возвращает undefined Я знаю, что это сработает, но выглядит довольно уродливо и запутанно:

var obj = {
            a : 'a constant',
            b : (function(){ return this.a + ' and b constant'; })()
}

И вот что у меня есть в настоящее время:

var obj = {
            a : 'a constant',
            b : 'a constant and b constant'
}

Я знаюдругие способы, которые некоторые прокомментировали, и я искренне благодарю их за ответ.Тем не менее, они не выглядят простыми или элегантными.Единственная проблема, с которой я сталкиваюсь в своей текущей реализации, заключается в том, что если значение 'a' когда-либо обновляется, search-n-replace должен выполняться во многих местах (я говорю много, потому что есть больше свойств, которые наследуются от 'a') вместоодин.

Ответы [ 6 ]

1 голос
/ 05 апреля 2011

Хорошо, вот СПОСОБ сделать это.Я не знаю, сработает ли это для вас, потому что это не повторяется, но попробуйте.Это позволяет использовать функцию reviver для работы с данными.

Обратите внимание, что исходная строка является допустимой строкой JSON, как вы и просили.Как уже упоминали другие, ваши примеры неверны11, IE8 и FF 3.6.

1 голос
/ 05 апреля 2011

JSON - это формат данных. У него нет понятия функций, как и у любого другого формата данных (HTML, XML, простой текст).

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

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

var obj = {
            a : 'a constant',
            b : '[fld=a] and b constant'
}

и ваш код на любом конце должен был бы реализовать и проанализировать это. Таким образом, он будет искать [fld=x] в каждом элементе и заменять его значением x. Но это все еще просто схема сжатия данных. Это не имеет ничего общего с JSON.

редактировать

Javascript Objects и JSON - это совершенно разные (хотя и связанные) вещи. Объект Javascript - это любая сущность в Javascript. JSON - это формат данных, предназначенный для представления программного объекта в текстовой нотации, в частности, для обмена данными с другими программными объектами по проводам (или когда внутренний формат не является переносимым).

Если вы просто спрашиваете, может ли объект Javascript содержать функцию, которая ссылается на другого члена, то, конечно, вы уже ответили на свой вопрос!

Вам не нужна самозапускающаяся функция, которая просто создает работу, и она также не будет отражать какие-либо изменения, внесенные в A в будущем. Просто выполните обычную функцию:

b : function() { return this.a + ' and b constant'; };

или, более вероятно, просто создайте "метод" и оставьте свои поля в покое:

var obj = {
            a : 'a constant',
            b : 'b constant',
            ab: function() { return a+b }
}
1 голос
/ 05 апреля 2011

В JSON нет. http://json.org/

Вы имели ввиду в javascript?

0 голосов
/ 28 июня 2011

Нашли потенциальное решение:

var obj = {
            a : 'a constant',
            b : obj.a + ' and b constant'
};

Спасибо всем за советы!Вынесу все хорошие предложения.

0 голосов
/ 05 апреля 2011

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

a = 'a constant';
var obj = {
            a : a,
            b : a + ' and b constant'
}

При определении объекта должен вызываться функциональный подход, а не оцениваться:

var obj = {
        a : 'a constant',
        b : function(){ return this.a + ' and b constant'; }
}
obj.b();

Другой подход, который, вероятно, также указывает на очевидное, является двухпроходной версией:

var obj = {
        a : 'a constant'
}
obj.b = obj.a + ' and b constant';
0 голосов
/ 05 апреля 2011
var obj = {};
obj["a"] = "a constant";
obj["b"] = obj["a"] + " and b constant";

Это не красиво и не JSON, но я думаю, что это ваша единственная надежда.

В противном случае разметьте JSON по-разному в соответствии с вашим вариантом использования:

var obj = {
    a: "a constant",
    b: "and b constant",
    prependAB: true
}

...

if(obj.prependAB){
    alert(obj.a + obj.b);
}
else{
    alert(obj.b);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...