Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用bind()创建隐私_Javascript - Fatal编程技术网

Javascript 如何使用bind()创建隐私

Javascript 如何使用bind()创建隐私,javascript,Javascript,我将一个对象文本传递到名为supportP()的框架方法中。这个对象文本有一个名为\u p的特殊属性,表示它的成员是私有的。通过对象文本中的with,可以通过this.\u p访问它。但是,当我将对象文本传递到“外部”范围时,我不会复制\u p。由于疏忽,它现在已被保密。为了从公共成员方法访问p,我使用bind()将它们绑定到原始对象,这样它们仍然可以通过this访问p 这样行吗?还有其他需要考虑的事情吗?在我测试之前想要一些反馈 下面是相关的片段 /*$A.supportP ** ** **

我将一个对象文本传递到名为
supportP()
的框架方法中。这个对象文本有一个名为
\u p
的特殊属性,表示它的成员是私有的。通过对象文本中的with,可以通过
this.\u p
访问它。但是,当我将对象文本传递到“外部”范围时,我不会复制
\u p
。由于疏忽,它现在已被保密。为了从公共成员方法访问p,我使用
bind()
将它们绑定到原始对象,这样它们仍然可以通过
this
访问p

这样行吗?还有其他需要考虑的事情吗?在我测试之前想要一些反馈

下面是相关的片段

/*$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);
这样行吗

是的,您可以通过
此访问“私有”属性。\u p

<> 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
    }
});
这样行吗

是的,您可以通过
此访问“私有”属性。\u p

<> 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
    }
});

使用点括号或方括号作为,但不要两者都使用。为什么要这样做?相信开发者不要弄乱你的隐私@Bergi:只有当属性名是动态的,并且在其他情况下是
时,他才使用[]符号。所以他完全按照它应该做的去做。“这行得通吗”问题通常可以用一个简单的测试用例来确认——你试过了吗?可以用点括号或方括号,但不能两者都用。你为什么要这样做?相信开发者不要弄乱你的隐私@Bergi:只有当属性名是动态的,并且在其他情况下是
时,他才使用[]符号。所以他完全按照它应该做的去做。“这行得通吗”问题通常可以用一个简单的测试用例来确认——你试过了吗?不,你是在复制原始值——而不是引用。对我来说,通过getter/setter保持它们的新鲜感听起来不是个好主意。你最初想做什么?。。。。确保…为什么不使用闭包?(这是唯一的可能性,
bind
做了类似的事情)JavaScript不是经典语言。@pure_code:取决于函数对对象做了什么(一个局部参数):-)顺便说一句,没有“匿名对象”函数可以有名称(或没有名称),但我从来没有听说过对象的术语。您总是将它们分配给变量或传递给函数(它们通常通过命名参数变量引用)。不,您复制的是基元值,而不是引用。对我来说,通过getter/setter保持它们的新鲜感听起来不是个好主意。你最初想做什么?。。。。确保…为什么不使用闭包?(这是唯一的可能性,
bind
做了类似的事情)JavaScript不是经典语言。@pure_code:取决于函数对对象做了什么(一个局部参数):-)顺便说一句,没有“匿名对象”函数可以有名称(或没有名称),但我从来没有听说过对象的术语。您总是将它们分配给变量或传递给函数(通常通过命名参数变量引用它们)。