在javascript中相互访问单例类和内部类

access singleton and inner classes each other in javascript

本文关键字:单例类 内部类 访问 javascript      更新时间:2023-09-26

我对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是单例类对象。
  2. 在jCanvas对象中,有许多单例类,如DrawingManager, MouseState, Color, BrushMode。还有2个非单例类(Point, DrawInfo)
  3. 我想要的是,在DrawingManager中,我想访问其他类和单例类对象。

问题是浏览器给出错误"MouseState is undefined"。

我想我对Java、c#等太熟悉了。我希望我的程序有良好的结构,但这个javascript让我很困惑,不知道如何做出好的设计模式..

声明函数时,不要使用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() { ... },
    ...
};

JavaScript中的单例类没有意义。或者创建一个构造函数(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,因为赋值没有被提升。拥有两种风格的函数声明是不一致的,除非你有一个很好的理由;