如何使用 bind() 创建隐私
Posted
技术标签:
【中文标题】如何使用 bind() 创建隐私【英文标题】:How to create privacy with the use of bind() 【发布时间】:2013-01-07 14:22:13 【问题描述】:我将一个对象字面量传递给一个名为supportP()
的框架方法。这个对象字面量有一个特殊的属性叫做_p
,它表示它的成员是私有的。从对象文字中的 with 可以通过this._p
访问它。但是,当我将对象文字传递到“外部”范围时,我不会复制 _p
。它现在已因遗漏而被私有化。为了从公共成员方法访问 _p,我使用 bind()
将它们绑定到原始对象,因此它们仍然可以通过 this
访问 _p。
这行得通吗?还有其他需要考虑的事情吗?在我测试之前想要一些反馈。
以下是相关的sn-ps。
/*$A.supportP
**
**
**
*/
$A.supportP = function (o, not_singleton)
var oo
key;
SupportList[o.Name] = ;
if (not_singleton)
// ignore this section
else // *look here - isFunc returns true if a function
for (key in o)
if ((key !== '_p') && (isFunc(o[key]))
oo[key] = o[key].bind(o);
else if (key !== '_p')
oo[key] = o[key];
else
// private (_p) - anything to do here?
return oo;
;
/*$A.test
**
**
**
*/
var singleton_object = $A.supportP(
_p: 'I am private',
Name: 'test',
publik_func: function ()
// this will refer to this object so that it can access _p
// this._p is accessible here due to binding
, false);
【问题讨论】:
member operators 使用点或方括号,但不能同时使用 为什么要这样做?相信开发者不会惹恼你的隐私。 @Bergi:他似乎只在属性名称是动态的情况下才使用 [] 表示法,而在其他情况下使用.
。所以他完全按照应有的方式去做。
“Will this work”问题通常可以通过一个简单的测试用例来确认——你试过了吗?
【参考方案1】:
这行得通吗?
是的,您将能够通过this._p
访问“私有”属性。
还有其他需要考虑的事情吗?
您正在克隆对象。然而,它的方法无法访问它 - 它绑定到“旧”对象,其属性不会反映副本上的更改。我不确定这是故意的还是偶然的。
为了严格的隐私,您需要使用带有局部变量的闭包。永远不能将属性设为私有。
var singleton_object = (function()
var _p = 'I am private'; // local variable
return
Name: 'test',
publik_func: function ()
// this will refer to this object so that it can access the properties
// _p is accessible here due to closure, but not to anything else
;
()); // immediately-executed function expression
另一种解决方案,使用两个不同的对象(一个隐藏的),它们被传递到框架方法中:
function bindPrivates(private, obj)
for (var key in obj)
if (typeof obj[key] == "function")
obj[key] = obj[key].bind(obj, private);
return obj;
var singleton_object = bindPrivates(
p: 'I am private'
,
Name: 'test',
publik_func: function (_)
// this will refer to this object so that it can access "public" properties
// _.p, a "private property" is accessible here due to binding the private
// object to the first argument
);
【讨论】:
不,您正在复制原始值 - 而不是引用。通过 getter/setter 让它们保持新鲜对我来说听起来是个坏主意。你最初想做什么? ....***.com/questions/3474697/… 确保... 为什么不使用闭包? (这是唯一的可能性,bind
做了类似的事情)javascript 不是经典语言。
@pure_code:取决于函数对对象的作用(本地参数):-) 顺便说一句,没有“匿名对象”
函数可以有名称(或没有),但我从未听说过对象的术语。您总是将它们分配给变量或将它们传递给函数(通常通过命名参数变量引用它们)。以上是关于如何使用 bind() 创建隐私的主要内容,如果未能解决你的问题,请参考以下文章
LangageExt:使用 Bind() 链接两个 Either,但无法弄清楚如何使用它们创建另一个 Either