Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用prototype的库子模块的专用名称空间_Javascript - Fatal编程技术网

Javascript 使用prototype的库子模块的专用名称空间

Javascript 使用prototype的库子模块的专用名称空间,javascript,Javascript,我正在开发一个大型JavaScript UI模块,请考虑iScroll维度中的一些内容。为了使事情保持正常,我将库拆分为几个逻辑子模块(如:触摸交互、DOM交互等),它们使用一个简单的子系统相互通信 每个子模块都有自己的名称空间,我用来存储变量。为了允许库的多个实例同时运行,构造函数包含一些逻辑,将分配给“toCopy”对象的每个命名空间直接复制到每个新实例中 基本结构如下所示: // constructor function Constructor() { for (var key in

我正在开发一个大型JavaScript UI模块,请考虑iScroll维度中的一些内容。为了使事情保持正常,我将库拆分为几个逻辑子模块(如:触摸交互、DOM交互等),它们使用一个简单的子系统相互通信

每个子模块都有自己的名称空间,我用来存储变量。为了允许库的多个实例同时运行,构造函数包含一些逻辑,将分配给“toCopy”对象的每个命名空间直接复制到每个新实例中

基本结构如下所示:

// constructor

function Constructor() {
  for (var key in this.toCopy) {
    // create a deep copy and store it inside the instance
    this[key] = utils.copyObj(this.toCopy[key]);
  }
}

Constructor.prototype.toCopy = {}


// sub-module #1

Constructor.prototype.toCopy._module1Namespace = {}

Constructor.prototype._privateFn = function() { /** do stuff within this._module1Namespace or send events */ }
Constructor.prototype._privateFn = function() { /** do stuff within this._module1Namespace or send events */ }


// sub-module #2

Constructor.prototype.toCopy._module2Namespace = {}

Constructor.prototype._privateFn = function() { /** do stuff with this._module2Namespace or send events */ }
Constructor.prototype._privateFn = function() { /** do stuff with this._module2Namespace or send events */ }
我的问题是:我真的不喜欢向库的其余部分公开每个子模块的名称空间。虽然我很有纪律,不会在子模块#2的函数中访问子模块#1的名称空间,但我希望它在技术上是不可能的

但是,由于UI库的多个实例必须同时运行,因此我无法将每个子模块放在闭包中,并在此闭包中定义私有名称空间。这将导致库的每个实例访问相同的子模块闭包,从而访问相同的命名空间

此外,将所有内容放在构造函数中而不是放在原型中会为每个新实例创建一组新的函数,这在某种程度上与良好库的概念相矛盾


到目前为止,我的研究还没有为这个问题提出任何有用的模式,我感谢所有的建议。

似乎您希望实例具有一组标准的属性,这些属性是在某个对象中定义的,而不是在构造函数中显式分配的。“标准”模式将是:

function Foo(a, b) {
  this.a = a;
  this.b = b;
}

Foo.prototype.fn = function() {
  // do stuff
}
但是,您似乎希望创建一个具有标准属性(可能还有默认值)的对象。也许这应该是构造函数的一个属性:

Foo.standardProps = {
  a: 'a',
  b: 'b'
}
现在在构造函数中,您可以执行以下操作:

function Foo() {
  cloneObj(Foo.standardProps, this);
}
cloneObj根据您的规范进行复制

请注意,关于如何复制或克隆javascript对象,有很多问题和答案。在一般情况下很难做到这一点,因为对于什么是拷贝与克隆、对象的不同类型以及如何处理非对象对象(如数组、日期和函数)以及宿主对象(如DOM元素,甚至窗口对象),存在不同的意见


因此,最好为您希望制作“深度”副本的对象类型定义一个有限的案例。您甚至可能希望使用getter和setter显式处理每种情况。

是否应该
Constructor.toCopy={}
be
Constructor.prototype.toCopy={}
utils.copyObj
做什么?for..in循环是否应该使用hasOwnProperty测试?也许你需要调查这个问题#toCopy:感谢您的注意,它确实是Constructor.prototype.toCopy。然而,这个错误就发生在示例代码中#utils.copyObj:这将创建对象的深度副本:utils.copyObj=函数(源){if(源===null | | typeof(源)!='object')返回源;var newObj=source.constructor();for(源中的var键){if(源.hasOwnProperty(键)){newObj[key]=utils.copyObj(源[key])}返回newObj;}#模块模式:已调查,认为没有帮助,需要将fns放入原型中。你能给我一个具体的例子吗?如果你想更仔细地看一下copyObj代码:我不知道为什么这个答案被投票率这么高,例如,在一般情况下,期望
obj.constructor()
可靠地返回一个对象是不明智的。大多数构造函数在作为函数调用时,将返回未定义的。我想我不明白你想做什么。“UI库的多个实例必须同时运行”没有意义,一个对象的多个实例有意义。“将所有内容都放在构造函数中……与良好库的概念相矛盾”,但这不是您使用copyObj所尝试的吗?#实例:jep,对象的几个实例。但这是语义学#构造函数:如果我们把所有函数都放在构造函数中,它们就会在每个新实例的内存中重复。通过将它们放入原型中,每个实例都使用相同的函数引用。我唯一要复制的是函数访问/更改的变量(因为每个实例都需要自己的副本)。谢谢你的回答!不幸的是,这不是我正在寻找的东西,但我将在未来几天内(希望如此)在一篇博客文章中概述这个问题,并保持这个线程的最新状态。