【问题标题】:Is this nested namespace inheritance pattern well implemented? [closed]这种嵌套命名空间继承模式是否实现得很好? [关闭]
【发布时间】:2016-05-02 01:44:18
【问题描述】:

我正在尝试使用对象以及从这些对象继承的对象来实现一些嵌套的命名空间。 我想知道第一种方法是否实施得很好:

// Namespaces
var firstDomain = {};
firstDomain.firstSubDomain = {};
firstDomain.firstSubDomain.secondSubDomain = {}

/*
* Base Object
*/
firstDomain.firstSubDomain.secondSubDomain.baseObject = (function(baseObject) {
  baseObject.init = function() {};

  return {
    init: baseObject.init
  }

})(firstDomain.firstSubDomain.secondSubDomain.baseObject || (firstDomain.firstSubDomain.secondSubDomain.baseObject = {}));

/*
* Extended Object
*/
firstDomain.firstSubDomain.secondSubDomain.extendedObject = (function(extendedObject) {
    extendedObject.init = function() {};
    extendedObject.init.prototype = Object.create(firstDomain.firstSubDomain.secondSubDomain.baseObject.init.prototype);
    extendedObject.init.prototype.extraFunction = function() {};

    return {
      init: extendedObject.init
    }

})(firstDomain.firstSubDomain.secondSubDomain.extendedObject || (firstDomain.firstSubDomain.secondSubDomain.extendedObject = {}))

// Objects instances

// Base object instance
var baseObject = new firstDomain.firstSubDomain.secondSubDomain.baseObject.init();

// Extended object instance and executing particular method
var extendedObject = new firstDomain.firstSubDomain.secondSubDomain.extendedObject.init();
extendedObject.extraFunction();

console.log(firstDomain);

这里是回购链接:

https://github.com/termosfera/JS_Design_Patterns/blob/master/namespace_subclassing/nested_namespaced_subclassing.js

【问题讨论】:

  • 实施得很好在什么意义上?
  • 嗨@Liam,感谢您的回答。我试图找到实现命名空间对象继承的最佳方法。您知道任何链接或教程,我可以在其中找到有关此的内容吗?我用谷歌搜索了它,但我没有找到这个实现。重点是:new firstDomain.firstSubDomain.SecondSubdomain.baseObject()
  • 谢谢,终于找到更好的办法了:github.com/termosfera/JS_Design_Patterns/blob/master/…
  • 你真的应该把它命名为firstSubSubDomain。 “第二”在这里非常混乱。

标签: javascript design-patterns namespaces


【解决方案1】:

这听起来像是两个问题合二为一,因为命名空间和子类化是两个不同的东西。

…baseObject = (function(baseObject) {
  baseObject.… = …

  return {
    …: baseObject.…
  }

})(…baseObject || (…baseObject = {}));

不,这是不正确的。您在这里混合了显示模块模式和装饰模块1 模式。你应该这样做

….baseObject = (function() {
  return {
    …: …
  };
})();

(function(baseObject) {
  baseObject.… = …;
})(….baseObject || (….baseObject = {}));

1:我其实不知道第二种模式叫什么

… = function() {};
….prototype = Object.create(other….prototype);
….prototype.extraFunction = function() {};

没关系,您从原型中继承的内容是正确的。但是,您可能想在构造函数中进行超级调用。

new ….baseObject.init();
new ….extendedObject.init();

这很奇怪。没有理由将构造函数命名为“init”。构造函数也应该大写。应该是这样的

new ….BaseObject();
new ….ExtendedObject();

【讨论】:

猜你喜欢
  • 2013-08-13
  • 2013-03-03
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2012-01-28
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多