Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 Obj应用(Obj):是否安全且性能良好?_Javascript_Oop - Fatal编程技术网

Javascript Obj应用(Obj):是否安全且性能良好?

Javascript Obj应用(Obj):是否安全且性能良好?,javascript,oop,Javascript,Oop,我想出了一个简单的设计模式,它的灵感来自其他几个设计模式。它的主要目的是让私有方法(而不是所有全局方法)可视化地嵌套和分组在对象中,并将“self”作为访问范围的可用变量,这在使用带有回调参数的调用函数时非常有用 它似乎工作正常,但执行Obj.apply(Obj)是否安全(性能和范围方面) 守则: function Obj() { var self = this; var privateFunc = function() { console.log('priv

我想出了一个简单的设计模式,它的灵感来自其他几个设计模式。它的主要目的是让私有方法(而不是所有全局方法)可视化地嵌套和分组在对象中,并将“self”作为访问范围的可用变量,这在使用带有回调参数的调用函数时非常有用

它似乎工作正常,但执行
Obj.apply(Obj)是否安全(性能和范围方面)

守则:

function Obj() {

    var self = this;

    var privateFunc = function() {
        console.log('private');
        self.otherPublic();
    };

    self.publicFunc = function() {
        console.log('pub1ic');
        privateFunc();
    };

    self.otherPublic = function() {
        console.log('pub2');
    };

} Obj.apply(Obj);
我这样称呼它:

Obj.publicFunc();

毫无意义的兄弟。通过
Obj.apply(Obj)你在做什么
以非直观的方式获取函数Obj,并向其添加这些方法

这:

做同样的事情,虽然更好。我说得更好是因为(1)它很直观,(2)
Obj
现在是一个简单的javascript对象(
typeof Obj==='object'
),而你的
Obj
是一个属性增强的函数(
typeof Obj=='function'

如果您想引用
self
,这并不难(尽管似乎没有必要),只需创建将在函数顶部返回的对象,并在函数末尾或创建公共方法时扩充它们

这是安全的,但毫无意义

另外,请注意,这些方法不能很好地扩展,因为对于
Obj
的每个实例,我们创建的每个函数都会被重新创建,这是内存方面的浪费。上面的模式很好,因为我们使用匿名函数创建了它,所以根据定义只能有一个实例,尽管对于需要多次实例化的类型,应该使用原型

别害怕,它是用来帮助你的

更新:

var Obj = (function(){

  var priv = function(){ pub2(); },
      privVar = 6,
      pub1 = function(){ priv(); },
      pub2 = function(){ console.log('1'); };

  return {
      pub1: pub1,
      pub2: pub2
  };

})();

Obj.pub1();
var Obj = (function(){

  var public = {},
      priv = function(){ public.pub2(); },
      privVar = 6;

  public.pub1 = function(){ priv(); },
  public.pub2 = function(){ console.log('1'); };

  return public;

})();

Obj.pub1();
注意,我调用了一个公共函数,它调用了一个私有函数,它调用了一个公共函数——没有特殊绑定,没有对象引用

更新2:

var Obj = (function(){

  var priv = function(){ pub2(); },
      privVar = 6,
      pub1 = function(){ priv(); },
      pub2 = function(){ console.log('1'); };

  return {
      pub1: pub1,
      pub2: pub2
  };

})();

Obj.pub1();
var Obj = (function(){

  var public = {},
      priv = function(){ public.pub2(); },
      privVar = 6;

  public.pub1 = function(){ priv(); },
  public.pub2 = function(){ console.log('1'); };

  return public;

})();

Obj.pub1();

-->谢谢你的评论。我知道这种模式,但我遇到的问题是:当我调用一个公共方法(它调用一个私有方法)时,私有方法不能调用任何公共方法(不指定对象),除非我保留一个单独的对象,该对象返回所有公共函数,比如
return{pub1:pub1,pub2:pub2}。此外,每次执行回调函数时,我都必须绑定或应用作用域。@Blaise,如果您没有很好地设置作用域,我将用一个示例编辑我的答案…@Blaise:您编辑了注释,因此现在我看到您不想返回
{pub1:pub1,…}
对象。为什么不呢?在理想情况下,我希望在定义函数时指定public/private,否则我必须单独更新该列表。这就是为什么我最终得到了
Obj.apply(Obj)。这可能是偏好的问题,如果没有办法,我可能会调整我的偏好…:)@布莱斯,就这样?我将再次更新我的答案,并向您展示如何使用相同的模式完成此操作。。。