这个嵌套的命名空间继承模式是否很好实现?

时间:2016-01-25 16:49:00

标签: javascript design-patterns namespaces

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

// 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

1 个答案:

答案 0 :(得分:2)

这就像两个问题一样,因为命名空间和子类化是两个截然不同的事情。

…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();