声明对象文字内部的原型

Mik*_*ike 1 javascript

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

MyConstructor.prototype = {
Run Code Online (Sandbox Code Playgroud)

下面提供了对象文字.

谢谢,迈克

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

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

Jak*_*kob 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;
}());
Run Code Online (Sandbox Code Playgroud)

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


meo*_*ouw 5

只需使用命名空间

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

myNamespace.myConstructor.prototype = {
    //...
}
Run Code Online (Sandbox Code Playgroud)

或另一种变化

var myNamespace = (function(){

    function myConstructor(){}

    myConstructor.prototype = {};

    return {
        myConstructor: myConstructor
    }

})();
Run Code Online (Sandbox Code Playgroud)