Javascript原型 - 需要帮助添加Helper原型

时间:2014-10-01 17:27:30

标签: javascript jquery prototype

好的,我怀疑这是一个独特的情况,所以要么有人这样做了,要么有人认为这是不可能的,至少在我问的方式。

我有2个原型变量(函数),一个是父类,另一个是帮助器。我想做的是从帮助程序中引用父项,以便每个父项的每个实例都可以使用帮助程序,同时允许帮助程序基本上扩展父项。我正在使用jQuery和javascript。

这是一个简化的例子:

var Parent = function(identity) {
    this.identity = identity;
    this.group = $(this.identity);
    this.helper = new Helper(this);
    return this;
};
Parent.prototype = {
    _setup : function(dolisten) {
        dolisten = dolisten || false;
        var that = this;
        that.group.each(function(i) {
            if ($(this).data('key') !== 'undefined') {
                that.elems[i] = new Object();
                that.elems[i].key = parseInt($(this).data('key'));
                // build out rest of elems object
            }
        });
        if (dolisten) {
            this._listen();
        }
    },
    _listen : function() {
        var that = this
        $('body').on('click tap', that.identity, function() {
            that.helper._showbusy(this, true);
            // do some other stuff
        }
    }
};
var Helper = function(reference) {
    this.reference = reference;
};
Helper.prototype = {
    _showbusy : function(elem, isbusy) {
        console.log(this.reference);
        // do some stuff to elem
    },
};

这可以工作,但在其自己的.helper节点内创建一个对Parent的基本无限引用。所以,如果没有实际每次传递父项(希望只创建一个单一的引用点,上面似乎会引起一个引用“循环”?),这可以优雅地完成吗?

最后,我想要的是一个简单的:

var obj = new Parent('.myClass');
console.log(obj);
// result : Parent { identity:'.myClass', group: [Object object], helper: {reference : *Parent without helper key included, which is where the looping seems to occur}, etc...

编辑:目前,我正在尝试传递助手所需的父母的特定键。这可以防止帮助程序无限级联到父本身及其本身的副本,但这是一个更优雅的解决方案,其中帮助程序可以访问整个父代,而不仅仅是传递的特定密钥,而无需级联助手对父代的引用成为父代 - >帮手 - >父母 - >帮手 - >父母 - >等...

2 个答案:

答案 0 :(得分:1)

您所指的是一个循环引用,它被定义为两个相互引用的数据结构。

var a = {value: 'A'};
var b = {value: 'B'};
a.b = b;
b.a = a;

console.log(a.b.a.b.a.b.a.b.a.b.a.b.value); // 'B'

在大多数情况下,这实际上没问题。现代垃圾收集器足够聪明,当对象到期时可以清理它,因此应该处理好内存。很多JS代码都会通过循环引用来停止对象。

您遇到的最大问题是,如果您想将对象编码为JSON,或者对该对象执行任何递归操作。

// continued code form above
JSON.stringify(a);
// TypeError: Converting circular structure to JSON

因为JSON生成是一个递归过程,所以它会钻入每个属性,这些属性将被锁定在循环引用中并生成无限量的JSON。

There are some ways handle that though

答案 1 :(得分:0)

我对我的代码做了一些调整,在console.logging结果之后,它看起来更清晰了。我发布这个作为一个潜在的答案,因为,我可以编辑我的问题,但我想将问题和答案之间的反馈分开,看看是否有人有任何潜在的变化或替代方案,除了那些已经发布的,这可能会提供更好的解决方案。

现在,我将继续这样做:

var Parent = function(identity) {
    if (identity) {
        this.identity = identity;
        this.group = $(this.identity);
        if (this.group.length > 0) {
            this.elems = new Array();
            this.helper = new Helper(this);
            this._setup(true);
        }
    }
    return this;
};

var Helper = function(reference) {
    for (var key in reference) {
        if (!this[key]) {
            this[key] = reference[key];
        }
    }
};

并从那里相应地延伸。