2

我一直在使用 dean edwards base.js (http://dean.edwards.name/weblog/2006/03/base/) 将我的程序组织成对象(顺便说一句,base.js 很棒,如果你以前没有使用过的话!)。无论如何,我的问题是通用的,您不必知道 base.js 就可以知道我的答案。

我在一个名为的对象中有一个属性,ref它是对 DOM 元素的引用,并且该对象旨在使用 保存为 JSON JSON.stringify,但正如您可以想象的那样,由于 DOM 元素是循环结构,我将无法将对象转换为 JSON。

现在为了解决这个问题,我有一个名为的方法html(),该方法旨在返回ref属性,但我需要将其ref作为私有属性,该属性只能从对象内部访问,因此不会被发送到stringify.

最好的方法是什么?

4

2 回答 2

3

你可能知道在 JavaScript 中不能有私有属性。

有趣的是,如果您传递一个JSON.stringify具有方法的对象toJSONJSON.stringify将自动调用该方法以获取该对象的 JSONable 表示。所以你所要做的就是实现这个方法。

例如,您可以创建仅包含要复制的属性的对象的浅表副本:

MyConstructor.prototype.toJSON = function() {
    var copy = {},
        exclude = {ref: 1};
    for (var prop in this) {
        if (!exclude[prop]) {
            copy[prop] = this[prop];
        }
    }
    return copy;
};

演示

另一种方法是使用自定义替换函数,但可能更难以控制ref排除哪个以及保留哪个(如果不同的对象具有ref属性):

JSON.stringify(someInstance, function(key, value) {
     if(key !== 'ref') {
         return value;
     }
});

演示

于 2012-08-01T14:42:34.260 回答
0

这是设置变量可见性的示例

function Obj(){
       this.ref = 'public property'; // this property is public from within the object

       var ref = 'private proerty'; // this property is private.

       var self = this;

        this.showRef = function(){
            alert(ref);
            alert(self.ref);
        };
    }

var obj = new Obj();
obj.showRef();
于 2012-08-01T14:34:48.343 回答