希望这个问题不会被标记为太主观,但我对 OOP 还很陌生,并且在我认为<的代码部分之间共享数据时有点困难 应该在某种程度上分开。
我正在构建一个(非地理) map 东西(使用 super 重复的 leaflet.js),它有一个 map (废话)和一个侧边栏,基本上包含一个 UI(单独和集体切换标记) ,搜索所述标记切换以及其他标准 UI 行为)。对组织也有点困惑(模块化是多么模块化,但我想我自己可以偶然发现这一点)。我暂时使用一个简单的 JSON 文件进行设置。
我从存储在本质上无法使用或不可重用的对象中的静态方法开始,因此我选择了嵌套构造函数(有点),这样我就可以传递父范围以便更轻松地访问我的设置和状态属性:
function MainThing(settings) {
this.settings = options;
this.states = {};
}
function SubthingMaker(parent) {
this.parent = parent;
}
SubthingMaker.prototype.method = function() {
var data = this.parent.settings.optionOne;
console.log(data);
this.parent.states.isVisible = true;
};
MainThing.prototype.init = function() {
this.subthing = new SubthingMaker(this);
// and some other fun stuff
};
然后我可以创建 MainThing
的实例并运行 MainThing.init()
,它应该一切顺利。就像这样:
var options = {
"optionOne": "Hello",
"optionTwo": "Goodbye"
}
var test = new MainThing(options);
test.init();
test.subthing.method();
我真的应该以这种方式嵌套还是会以某种方式给我带来问题?如果这确实可以,如果需要的话我应该继续深入吗(也许我的用户界面的搜索部分想要它自己的部分,也许 map 控件应该与 DOM 操作分开,我不知道)还是应该留在这个深度?当我创建它们的实例时,我应该只拥有单独的构造函数并将它们存储在一个对象中吗?这会让共享/引用存储在其他地方的数据变得困难吗?
关于我的数据存储,这是处理它的好方法还是我应该为我的数据创建一个 Controller 并在必要时向其发送请求和提交,即使该数据随后以简单的 JSON 格式隐藏? this.parent
一段时间后确实开始变得烦人,我想如果我想更改我的范围,我真的应该进行绑定(bind),但这似乎不是访问整体的优雅方式应用程序的状态数据,特别是因为 UI 需要检查它所做的几乎所有事情的状态。
希望您能提供帮助,我希望我不要给人留下一个十足的白痴的印象,谢谢!
附注我认为我发布的代码有效,但如果无效,则这是我希望捕获的一般想法,而不是这个具体示例。我创建了一个更简单的实际代码版本,因为我不想因为我的第一篇文章而招致众神的愤怒。 (是的,我确实只是使用了附记。)
最佳答案
一个对象可以包含适合完成其工作的任意数量的其他对象。例如,对象可能包含数组作为其实例数据的一部分。或者,它可能包含一些其他自定义对象。这是正常且常见的。
您可以在构造函数或其他一些方法(例如 .init()
方法)中创建/初始化这些其他对象,这些对象是实例数据的一部分,以更适合您的使用和设计。
例如,您可能有一个 Queue
对象:
function Queue() {
this.q = [];
}
Queue.prototype.add = function(item) {
this.q.push(item);
return this;
}
Queue.prototype.next = function() {
return this.q.shift();
}
var q = new Queue();
q.add(1);
q.add(2);
console.log(q.next()); // 1
这将创建一个 Array 对象作为其构造函数的一部分,然后在执行其函数时使用该 Array 对象。无论是创建内置 Array 对象还是在某些自定义构造函数上调用 new
,这里都没有区别。它只是宿主对象用来执行其功能的另一个 Javascript 对象。这是正常且常见的。
关于JavaScript:构造函数实例嵌套在构造的 'wrapper' 中是否有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35422018/