Javascript Obj应用(Obj):是否安全且性能良好?
我想出了一个简单的设计模式,它的灵感来自其他几个设计模式。它的主要目的是让私有方法(而不是所有全局方法)可视化地嵌套和分组在对象中,并将“self”作为访问范围的可用变量,这在使用带有回调参数的调用函数时非常有用 它似乎工作正常,但执行Javascript Obj应用(Obj):是否安全且性能良好?,javascript,oop,Javascript,Oop,我想出了一个简单的设计模式,它的灵感来自其他几个设计模式。它的主要目的是让私有方法(而不是所有全局方法)可视化地嵌套和分组在对象中,并将“self”作为访问范围的可用变量,这在使用带有回调参数的调用函数时非常有用 它似乎工作正常,但执行Obj.apply(Obj)是否安全(性能和范围方面) 守则: function Obj() { var self = this; var privateFunc = function() { console.log('priv
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)代码>。这可能是偏好的问题,如果没有办法,我可能会调整我的偏好…:)@布莱斯,就这样?我将再次更新我的答案,并向您展示如何使用相同的模式完成此操作。。。