Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在名称空间javascript中创建新对象_Javascript_Object_Instance - Fatal编程技术网

在名称空间javascript中创建新对象

在名称空间javascript中创建新对象,javascript,object,instance,Javascript,Object,Instance,我正在尝试在名称空间中创建一个函数,该函数将为我获得一个新的对象实例 尝试执行以下操作时出现语法错误: var namespace = { a : function(param){ this.something = param; }, a.prototype.hi = function(){ alert('hi'); }, b : function(){ var t = new a('something')

我正在尝试在名称空间中创建一个函数,该函数将为我获得一个新的对象实例

尝试执行以下操作时出现语法错误:

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

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

执行此操作的正确语法是什么?是否无法在
命名空间
对象中执行此操作?我不想先声明名称空间。感谢

javascript名称空间是一个对象,因此您只能使用
键:值
耦合,而不能使用代码(就像您使用:
A.prototype.hi=function(){…}

因此,您应该将其分为两部分:声明和代码:

var namespace = {
    a : function(param){
        this.something = param;
    },
    b : function(){
        var t = new a('something');
    }
};

namespace.a.prototype.hi : function() { ... }
我不想先声明名称空间

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

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
     }
})();

我不知道你想要什么,但这是可行的:

var namespace = {

    a: function() {

        function a() {

        }

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

        return new a;

    }

}

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

// -> 'hi'

重复。请看下面的答案:谢谢Eli-我知道必须有一个简单的方法来做这件事,这对我来说似乎很常见。不幸的是,我现在必须做一些代码重构,但我不认为这会太糟糕。我不确定你的评论“无代码”的意思是什么——这显然不是真的。是的,可能它的表述很糟糕,这里是“key”
a.prototype.hi
,这在javascript对象中是不可能的,但在值中,你可以添加任何你想要的代码!谢谢,我想我会重构以使用模块模式。