【发布时间】:2014-07-20 16:11:13
【问题描述】:
我有一个商业应用程序,它具有使用原型链的现有 JavaScript 对象结构。通过向对象原型添加更多方法,我已经成功地扩展了这个 API。但是,我意识到最好在我的方法前面添加一个命名空间,以防应用程序供应商决定在未来版本中将新方法命名为与我的方法之一相同。
如果我有一个名为 State 的现有对象,我将添加一个名为 getPop 的方法,如下所示:
State.prototype.getPop = function(){return this.pop;};
var Washington = new State('Washington',7000000);
Washington.getPop(); //returns 7000000
我想要做的是在我的自定义方法之前添加一个名为“cjl”的命名空间以避免名称冲突,以便我可以这样调用它:
Washington.cjl.getPop();
我试过了:
State.prototype.cjl = {};
State.prototype.cjl.getPop = function(){return this.pop;};
问题是这个。它不指向实例,而是指向“cjl”对象。
我尝试了各种方法,包括使用 .bind(),但它们似乎都不起作用。我终于在这里找到了答案:Is it possible to organise methods on an object's prototype into namespaces? 这使用 Object.defineProperty() 方法工作。问题是商业应用程序只能在 IE 的兼容模式下工作,不支持非 DOM 元素的 Object.defineProperty() 方法。
还有其他方法可以做到这一点吗?我不想调用多个函数,这是一些技术的结果,例如:
Washington.cjl().getPop();
【问题讨论】:
-
最好在方法名称前加上前缀。没有真正干净的解决方案可以做你想做的事。
-
只做
Washington.cjl_getPop();要好得多,因为它更容易实现且执行速度更快,并且确实没有比您提议的名称冲突的可能性更大(实际上,它可能甚至更少容易发生碰撞)。在原型上使用子对象并不简单。 -
嗯,我有点庆幸这并不简单,因为试图让它发挥作用让我质疑我的中级 JavaScript 技能的合法性。我想让使用它的人尽可能轻松和干净地使用我的扩展程序,这就是为什么我想尽可能避免使用前缀方法,但我可能只是依靠它。
标签: javascript namespaces prototype