2016-01-25 31 views
0

我试图用对象和从这些对象继承的对象来实现一些嵌套的命名空间。 我想知道,如果这第一种方法是很好的落实:这个嵌套的命名空间继承模式很好地实现吗?

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

*很好的实施*在什么意义上? – Liam

+0

Hi @Liam,谢谢你的回答。我正试图找到实现名称空间对象继承的最佳方式。你知道任何链接或教程,我可以找到这方面的东西吗?我搜索了它,但我没有找到这个实现。 点是得到这样的:新firstDomain.firstSubDomain.SecondSubdomain.baseObject() – Termosfera

+1

[试试这个(https://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_the_prototype_chain) – Liam

回答

2

这倒像是在一个两个问题,作为命名空间和子类是两个不同的的东西。

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

    return { 
    …: baseObject.… 
    } 

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

不,那是不正确的。您在此处将显示模块图案与装饰模块图案混合。你应该做任何

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

感谢@Bergi是啊,我终于使这个实现(你说的基本上是什么)https://github.com/termosfera/JS_Design_Patterns/blob/master/namespace_subclassing/nested_namespaced_subclassing.js – Termosfera

+1

那'my'对象仍然是多余的。你应该使用函数声明'函数BaseObject(){...}'然后'返回BaseObject;' – Bergi