Obj.apply(Obj):它安全且高效吗?

时间:2011-03-31 13:10:44

标签: javascript oop

我想出了一个简单的设计模式,其灵感来自其他几种设计模式。它的主要目的是拥有私有方法(而不是全局),在对象中可视化嵌套和分组的方法,并将“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();

1 个答案:

答案 0 :(得分:2)

完全没有意义的兄弟。你在Obj.apply(Obj);所做的是采用Obj函数,并以不直观的方式添加这些方法。

此:

var Obj = (function(){

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

  return {
      pub1: function(){ console.log('1'); },
      pub2: function(){ priv(); }
  };

})();

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

如果你想要引用typeof Obj === 'function'并不难(虽然看起来没必要),只需创建将在函数顶部返回的对象,并在最后添加公共方法,或者当你制作它们时......

这是安全的,但毫无意义。

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

不要害怕它,它会有所帮助。

<强>更新

Obj

请注意,我调用了一个公共函数,它调用一个私有函数,它调用一个公共函数 - 没有特殊绑定,没有对象引用。

更新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();