如何使用 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

如何在不为其创建专用网站的情况下为我的应用提供隐私政策?

如何使用 context.bind 绑定 DataSource。连接池等

如何隐藏手机应用?

C ++如何创建'bind'字符串文本替换方法?

如何在bind()中处理'new'运算符?