【问题标题】:How do you namespace objects in the Revealing Prototype Pattern?您如何在显示原型模式中命名对象?
【发布时间】:2013-04-09 19:29:20
【问题描述】:

我一直在使用显示模块模式并且有多个命名空间。 示例:

// here's the namespace setup

var myProject= myProject|| {};
var myProject.models= myProject.models || {};

myProject.models.MyModel= function(){
   var someMethod = function(){
     // do something
   };
   return{
      SomeMethod = someMethod
   };
}

我将移至Revealing Prototype Pattern 以获得一些内存使用改进,因此我可以将对象装饰为另一个功能。如何将其保存在 myProject.models 命名空间中? 这给出了我的 JavaScript 错误:

var myProject.models.MyModel= function(){
   // properties here
};

myProject.models.MyModel.prototype = (function(){
   // methods here
    var someMethod = function(){
         // do something
    };
    return{
       SomeMethod = someMethod
    };
}());

【问题讨论】:

  • 去掉var关键字!您正在分配一个属性,而不是创建一个变量。
  • 好的,所以删除 var 确实会运行。我在看他的例子,认为 var 是必需的。

标签: javascript prototype revealing-module-pattern


【解决方案1】:

您有各种语法错误。

myProject = window.myProject|| {};

myProject.models = myProject.models || {};

myProject.models.MyModel = (function () {
   //declare a constructor function
   function MyModel() {
   }

   //declare a function that will be publicly available on each MyModel instances
   MyModel.prototype.someFunction = function () {
       //call the private function from within the public one
       //note: you have to be careful here since the context object (this) will be
       //window inside somePrivateFunction
       somePrivateFunction();

       //call the private function and set the context object to the current model instance
       //somePrivateFunction.call(this);           
   };

   //declare a private function
   function somePrivateFunction() {
   }

   return MyModel; //return the model constructor
})();

现在你可以像这样使用你的模型:

var m = new myProject.models.MyModel();
m.someFunction();

【讨论】:

  • 我的目标是做一个 var x = new myProject.models.MyModel() 并传入一些值,然后再调用 x.SomeMethod();
【解决方案2】:
var myProject = myProject || {};
^^^

您在这里使用var statement 来声明全局myProject 变量(如果还没有的话),这样它就不会抛出Undefined variable 异常。 (如果它现在有值,你也将它初始化为一个空对象)

var myProject.models= myProject.models || {};

在这里,您将models 属性分配给上面的对象。 var 关键字在这里不合适;删除它,它会工作。

myProject.models.MyModel = … 你在上面的 sn-p 中做对了,在第二个中做错了;我不确定您要使用哪个。显示原型模式应该如下所示:

var myProject = myProject || {};
myProject.models = myProject.models || {};
myProject.models.MyModel = (function(){
    function MyModel() {
        // instance properties here
    }
    function someMethod(){
        // do something
    }
    MyModel.prototype.SomeMethod = someMethod;
    //                ^ lowercase that?
    return MyModel;
})();

【讨论】:

  • 原型函数应该在 .MyModel (function()? 从我的问题中的链接中,他在外面。我现在开始看属性,你应该如何公开那些返回{}?
  • 不需要。我不喜欢覆盖原始原型对象(例如保留.constructor 属性),但您也可以为其分配一个对象字面量。
  • 有趣。这对我来说很新鲜。谢谢
猜你喜欢
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多