gpt4 book ai didi

javascript - 访问对象的父对象

转载 作者:行者123 更新时间:2023-11-29 15:40:21 25 4
gpt4 key购买 nike

好的,首先我知道一个对象没有对其容器的引用,除非明确定义,所以我正在寻找解决办法。

采用以下代码(为了可读性从我的用例中大大简化):

var cid = 0;
var Command = function(c) {
this.id = cid += 1;
this.transient = false;
return this;
}

var sid = 0;
var CommandSet = function() {
this.id = sid += 1;
this.commands = [];
this.transients = 0;
return this;
}

CommandSet.prototype.parent = null;
CommandSet.prototype.recurse = function(callback) {
callback.call(this);
if (this.parent instanceof CommandSet) {
this.parent.recurse(callback);
}
}

CommandSet.prototype.createSubset = function() {
var set = new CommandSet();
set.parent = this;
set.commands = this.commands;
set.transients = this.transients;
return set;
}


CommandSet.prototype.addCommand = function(c) {
if (c instanceof Command) {
this.commands.push(c);
if (c.transient) {
this.recurse(function() {
this.transients++;
});
}
}
return this;
}

CommandSet.prototype.toggleTransient = function(c) {
if (c instanceof Command) {
c.transient = true;
this.recurse(function() {
this.transients++;
});
}
return this;
}

如果我执行以下操作 ( http://jsfiddle.net/5KGd8/1/):

var s1 = new CommandSet();
var c1 = new Command();
var c2 = new Command();
s1.addCommand(c1).addCommand(c2);

var s2 = s1.createSubset();
var s3 = s1.createSubset();
s2.toggleTransient(c1);

console.log(s1);
console.log(s2);
console.log(s3);

s1 现在有 1 个 transient ,s2 现在有 1 个 transient ,但是 s3 仍然没有,尽管包含对相同 的引用命令对象。

可能的解决方案:

  1. 我可以为每个存储所有命令的命令构建一个引用设置它位于内部并遍历那些,但是这是会导致一些严重的内存问题,因为我的真实本性应用程序要求子集可以被垃圾收集(用户会经常在没有意识到的情况下匿名创建很多),这将保留一个在使用它们之后引用它们。 parent 引用很好,因为我希望父集存在,只要它有一个幸存的子集。

  2. 我可以明确地强制用户在当不再需要时子集将删除对它的所有内部引用,但这会使事情复杂化他们和我都喜欢自动工作的东西。我的应用程序的性质意味着我希望用户有时甚至可能没有意识到他们已经创建了子集(通过在子集上创建和执行的其他功能)。

谁能想出一种方法来解决这个问题,而不会出现我的两个解决方案中描述的问题?

最佳答案

抱歉,这不是答案,但想确保我理解问题。

CommandSet 可以有命令,当您更改命令的 transient 属性时,您希望包含该命令的 CommandSet 具有更新的 transient 计数器它包含的命令。

如果故事到此结束,您可以简单地让 Command 维护 Command 所在的 CommandSet 列表并更新它的容器。

但这不会起作用,因为您将在函数中创建 CommandSet,当它们超出范围时,它们将不会被垃圾回收,因为它们包含的 Command(s) 将保留对它们的引用。这些命令不会超出 CommandSet 的范围,因为它们也包含在其他(全局)CommandSet 中。

重新分配原始类型(transients)不会在子集或主集中重新分配它,但是如果 transients 不是原始类型怎么办?

在构造函数中:

this.transients = {count:0};

在创建子集中

set.transients = this.transients

在toggleTransient中

this.transients.count++; or --

无论您是在子集中还是在主集中摆弄 transient ,只要您使用 toggleTransient,它就会为所有的 count 改变。

关于javascript - 访问对象的父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20142715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com