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