Javascript OOP framework

Javascript OOP framework

本文关键字:framework OOP Javascript      更新时间:2023-09-26

我想知道下面的代码是否是定义在js中创建类的包装器函数的最佳方式。

有没有人愿意分享一个更好的例子,因为我认为这是第一次尝试。

如果有什么遗漏的话,我会错过什么?

j = {
    context : {}
};
j.namepsace = (function(){
    var createnamespace = function(parent, remainder){
        if(remainder.length === 0){
            return;
        }
        parent[remainder[0]] = parent[remainder[0]] || {};
        return createnamespace(parent[remainder[0]], remainder.splice(1));
    };
    return {
        define : function(ns){
            createnamespace(j.context, ns.split('.'));
        }
    }
}());
j.class = (function(){
    return {
        construct : function(namespace, name, ctor){
            namespace[name] = ctor;
        },
        ctor : function(namespace, name, ctor, prototype){
            for (var property in prototype) {
                if (prototype.hasOwnProperty(property)) {
                    ctor.prototype[property] = prototype[property];
                }
            }
            namespace[name] = ctor;
        }
    }
}());
j.mixin = (function(){
    return {
      with : function(object, objectliteral){
          for (var prototype in objectliteral) {
              if (objectliteral.hasOwnProperty(prototype)) {
                  object[prototype] = objectliteral[prototype];
              }
          }
      },
      toDefintion : function(classdefinition, mixin){
          var objectliteral =  mixin();
          for (var property in objectliteral) {
              if (objectliteral.hasOwnProperty(property)) {
                  classdefinition.prototype[property] = objectliteral[property];
              }
          }
      }
    };
}());
j.namepsace.define('application.section');
j.class.construct(j.context.application.section,'printNameMixin', function(){
    return {
        printName : function(){
            console.log(this.name);
        }
    };
});
j.class.construct(j.context.application.section,'person',function(name, address, age){
    return {
        name : name,
        address : address,
        age : age
    };
});
j.class.ctor(j.context.application.section,'customer',function(name){
    this.name = name;
}, {
    name : 'unregistered client'
});
j.mixin.toDefintion(j.context.application.section.customer, j.context.application.section.printNameMixin );
var person = j.context.application.section.person('Blair Davidson','23 Test St',33);
var cust = new j.context.application.section.customer("Bankwest");
cust.printName();
console.log(person);

您的方法很有趣,但当您询问问题时,我会注意到3件事:

1.原型

使用您的方法,您可以打破原型链的机制,这是javascript的强大功能之一。

2.继承

mixin模式不是我最喜欢的模式,因为它经常用于模拟多重继承。但是,正如单一响应性原则和继承只能用于在具有相同响应性的类之间分解代码的事实所表明的那样,在一个好的OOP设计中应该避免多重继承。

3.OOP

如果你想做一些强大的OOP,你肯定需要更多的功能(比如接口、依赖注入…)。为此,我建议你看看现有的框架,因为这是一项非常长的任务(相信我)。您可以在我的配置文件中的链接后面看到一个此类框架的示例(这是一个仅适用于nodejs的javascript框架,但您可以在客户端(浏览器)和服务器(nodejs)端使用)。