声明对象文字内部的原型

时间:2010-12-07 22:40:15

标签: javascript

我正在创建一个对象文字,我将其用作命名空间。对象文字(命名空间)碰巧包含构造函数MyConstructor。我想在对象文字中扩展MyConstructor的原型。如果我将MyConstructor的声明拉出来并将其放在myNamespace的声明之上,那么一切都很好,除了myConstructor不再被myNamespace命名。如何最好地使这项工作?以下无法编译,因为
 '。'在这一行:

MyConstructor.prototype = {

下面提供的对象文字。

谢谢, 麦克

var myNamespace = {
    a:  3,
    b: function (msg) {
        alert(this.a);
    },
    MyConstructor: function(xx) {
        this.x = xx;
    },
    MyConstructor.prototype = {
        a: 1,
        b: function() {
            return true;
        }
    }
};

更新:已接受的解决方案有效。但是,我的问题的前提是有缺陷的。在这种情况下,我根本不会使用对象文字,因为我发现单元测试更难。相反,我会使用由构造函数创建的普通对象,并将私有对象放在其中。另一件事是,“自我/立即执行的功能”,虽然在某些方面很漂亮,但对新手来说有点难以解释。

3 个答案:

答案 0 :(得分:5)

你根本不能在对象文字中这样做。遗憾。

至于解决方法,请使用函数创建myNamespace。这样它就不必是文字,但你仍然可以获得命名空间的效果:

var myNamespace = (function(){

  var ns = {
    a:  3,
    b: function (msg) {
      alert(this.a);
    },
    MyConstructor: function(xx) {
      this.x = xx;
    }
  };

  ns.MyConstructor.prototype = {
    a: 1,
    b: function() {
        return true;
  }

  return ns;
}());

所以这里发生的是myNamespace设置为立即调用的函数的值,并返回您所追求的实际命名空间对象。没有其他代码可以访问函数中的内容,但由于它在函数内部,您可以执行任何操作,而不仅仅是对象文字。这解决了你的问题;)

答案 1 :(得分:5)

只需使用命名空间

var myNamespace = {
    myConstructor: function( x ) {
        this.x = x;
    }
}

myNamespace.myConstructor.prototype = {
    //...
}

或其他变体

var myNamespace = (function(){

    function myConstructor(){}

    myConstructor.prototype = {};

    return {
        myConstructor: myConstructor
    }

})();

答案 2 :(得分:0)

如何创建一个返回MyConstructor的生成器函数。如果你创建一个名为createMyConstructor的函数,然后立即调用它,它将返回你想要的。

var myNamespace = {
    a:  3,
    b: function (msg) {
        alert(this.a);
    },
    MyConstructor: (function createMyConstructor() {
        var cons = function(xx) {
            this.x = xx;
        };
        cons.prototype = {
            a: 1,
            b: function() {
                return true;
        };
        return cons;
    })()
};