在JavaScript命名空间中创建一个新对象

3

我正在尝试在命名空间内创建一个函数,以获取一个新的对象实例。

当我尝试执行以下操作时,我会遇到语法错误:

var namespace = {
    a : function(param){
        this.something = param;
    },
    a.prototype.hi = function(){
        alert('hi');
    },

    b : function(){
        var t = new a('something');
    }
};

这该怎么做才是正确的语法?有没有可能在namespace对象内执行此操作?我不想先声明命名空间。谢谢。

重复。请参考此SO答案以了解如何实现:https://dev59.com/X2w05IYBdhLWcg3wnjAk - Eli Gassert
谢谢Eli - 我知道肯定有一种简单的方法来做这件事,对我来说似乎很常见。不幸的是,我现在必须进行一些代码重构,但我认为这不会太糟糕。 - JavaKungFu
3个回答

7

我不想先声明命名空间。

你可以像这样做一些奇怪的事情:

var namespace = {
    init: function() { 
        a.prototype.whatever = function(){};
    },
    a: function(x) {
        this.x = x;
    }  
}
namespace.init();
var myA = new namespace.a("x");

如果您想封装所有内容,为什么不尝试使用模块模式呢?它更加清晰简洁:
var namespace = (function() {
     function a() {};
     function b(name) {
          this.name = name;
     };
     b.prototype.hi = function() {
          console.log("my name is " + this.name);
     }
     return {
          a: a,
          b: b
     }
})();

谢谢,我想我会重构代码以使用模块模式。 - JavaKungFu

0
JavaScript 命名空间是一个对象,因此您只能使用 key: value 对,而不能使用代码(就像您使用 a.prototype.hi = function() {...} 一样)。
因此,您应该分成两部分:声明和代码:
var namespace = {
    a : function(param){
        this.something = param;
    },
    b : function(){
        var t = new a('something');
    }
};

namespace.a.prototype.hi : function() { ... }

我不确定你的评论“没有代码”是什么意思 - 这显然是不正确的。 - JavaKungFu
是的,可能表述不太好,这里的“关键”是 a.prototype.hi,在 JavaScript 对象中是不可能的,但在值中,您可以添加任何代码! - Samuel Caillerie

0

我不确定您想要什么,但这个可以工作:

var namespace = {

    a: function() {

        function a() {

        }

        a.prototype.hi = function() {
            console.log("hi");
        }

        return new a;

    }

}

var obj = new namespace.a();
obj.hi()

// -> 'hi'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接