好的,我怀疑这是一个独特的情况,所以要么有人这样做了,要么有人认为这是不可能的,至少在我问的方式。
我有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...
编辑:目前,我正在尝试传递助手所需的父母的特定键。这可以防止帮助程序无限级联到父本身及其本身的副本,但这是一个更优雅的解决方案,其中帮助程序可以访问整个父代,而不仅仅是传递的特定密钥,而无需级联助手对父代的引用成为父代 - >帮手 - >父母 - >帮手 - >父母 - >等...
答案 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。
答案 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];
}
}
};
并从那里相应地延伸。