在javascript

时间:2015-07-30 08:22:32

标签: javascript singleton encapsulation

我是javascript的新手。我很困惑,javascript对象!!

我的代码框架在下面......

var jCanvas = new function(){
    this.init = function(canvasID){
        ...
    };

    var DrawingManager = new function(){
        drawInfos = [];   // DrawInfo objects will be pushed into this
        this.mouseState = MouseState.released;
        ...
    };

    function DrawInfo(bm, cl, id, x, y){
        ...
    }

    function Point(x, y){
        ...
    }

    var MouseState = new function(){
        ...
    };

    var Color = new function(){
        ...
    };

    var BrushMode = new function(){
        ...
    };
};
  1. 我希望jCanvas成为单例类Object。
  2. 在jCanvas对象中,有许多单例类,如DrawingManager,MouseState,Color,BrushMode。还有2个不是单例类的类(Point,DrawInfo)
  3. 我想要的是,在DrawingManager中,我想访问其他类和单例类对象。
  4. 问题是浏览器给出的错误是“MouseState未定义”。

    我觉得我对Java,C#等太熟悉了......我希望我的程序结构很好但是这个javascript让我很困惑,不知道如何制作好的设计模式..

    请帮帮我..

2 个答案:

答案 0 :(得分:2)

要声明功能,请不要使用new关键字。仅在创建对象实例时使用它。

在JavaScript中,您可以声明一个"类"像这样(函数的主体是构造函数):

function MyClass (arg1) { 
    this.myClassProperty = arg1;
}

然后实例化它:

var myObj = new MyClass();

如果要创建单例,最好的方法是使用立即调用的函数:

var MySingleton = (function() {
    var myPrivateFunction = function() { ... };
    var myExportedFunction = function() { ... };
    var myPrivateVar = 5;
    return {
       myExportedFunction: myExportedFunction
    };
})();

在这里,您创建一个匿名函数并立即运行它。虽然这是一种更先进的概念。 或者您可以简单地创建一个对象:

var MySingleton = {
    myProperty: 1,
    myFunction: function() { ... },
    ...
};

答案 1 :(得分:1)

JavaScript中的Singleton类毫无意义。要么构造一个(Java人员的“类”)来实例化多个对象,要么创建一个对象。制作一个只能使用一次的构造函数是没有意义的,然后让代码进行完整性检查,确定你是否真的只使用过一次。只需制作一个物体。

错误的原因可能是(但我可能错了,我猜错了代码的其余部分)var x = function ...function name() ...形式之间的误解。致白:

var a = function() { console.log("a"); }
function b() { console.log("b"); }

a(); // a
b(); // b
c(); // c
d(); // TypeError: d is not a function

function c() { console.log("c"); }
var d = function() { console.log("d"); }

它们的效果相同,但它们是否悬挂在示波器的顶部是不同的。 var d被提升,就像function c() { ... }一样 - 所以变量d将会存在,但会undefined,因为分配不会被提升。除非你有充分的理由,否则两种函数声明样式都是不一致的;选择其中一个并坚持下去,这就是我的建议。