JavaScript:构造函数实例嵌套在构造的 'wrapper' 中是否有问题?

标签 javascript oop constructor nested prototype

希望这个问题不会被标记为主观,但我对 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/

相关文章:

javascript - 您可以在 Kendo UI 中制作具有多个字段的单个过滤器吗?

javascript - webpack 编译器根本不会将 es6 语法转换为旧版本的语法

c++ - 为什么重载运算符不起作用?

java - 从另一个类获取类型

c# - 使用反射实例化类而不运行其构造函数

javascript - 用于视频捕获的 Chrome 或 Firefox 扩展

javascript - 尝试制作一个基本的加载页面

java - 找到异常调用者并修改以显示值

scala - scala 中主构造函数参数的可访问性

数组的 C++ 构造函数初始值设定项