Javascript对象文字表示法 - 创建mixins(有点)

时间:2011-04-04 20:10:13

标签: javascript json

缺少更好的标题......是否有可能在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 个答案:

答案 0 :(得分:1)

在JSON中,没有。 http://json.org/

你的意思是javascript吗?

答案 1 :(得分:1)

JSON是一种数据格式。它没有任何功能概念,就像任何其他数据格式(HTML,XML,纯文本)一样。

这似乎服务的唯一目的是数据压缩。为什么不使用众多标准实现之一来压缩数据呢?

如果您希望您的数据具有大量冗余,而这种冗余无法通过正常的压缩方案进行有效压缩,那么您可以执行类似于此处所述的操作,例如:

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

并且你们两端的代码都必须实现并解析它。也就是说,它将在每个成员中搜索[fld=x]并用成员x的值替换。但它仍然只是一种自定义数据压缩方案。它与JSON无关。

修改

Javascript ObjectsJSON完全不同(虽然相关)。 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 }
}

答案 2 :(得分:1)

好的,here's这样做的方法。我不知道这是否适合你,因为它没有递归,但试试看。这使用reviver函数来操作数据。

请注意,原始字符串是您请求的有效JSON字符串。正如其他人提到的那样,你的例子不是有效的JSON。

示例

var json = '{"a":"a constant","b":"[get:a] and b constant","c":"test"}';
var jsonobj = JSON.parse(json, function(key, value) {
    //Ensure that value has the match function, ie. it's a string
    if (value.match) {
        //check for [get:xxx]
        var matches = value.match(/\[get:([^\]]*\])/g);
        //if something was found
        if (matches) {
            //Loop through each match.
            for (i=0; i<matches.length; i++) {
                //check if this object has that property
                if (this[matches[i].substring(5, matches[i].length-1)]) {
                    //If it does, replace the matched text with
                    //  the property's value.
                    // Note: It's split onto two lines for clarity on SO
                    value = value.replace(matches[i],
                             this[matches[i].substring(5, matches[i].length-1)]);
                }
            }
        }
    }
    return value; //Return the possibly modified value
});

修改
另外,我在Opera 11,IE8和FF 3.6上进行了测试。

答案 3 :(得分:0)

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);
}

答案 4 :(得分:0)

据我所知,简短的回答是否定的,尽管有很多方法可以通过更多参与代码来实现。显而易见的是将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';

答案 5 :(得分:0)

找到了一个潜在的解决方案:

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

感谢大家的提示!提出所有好的建议。