我将对象文字传递给名为supportP()
的框架方法。此对象文字有一个名为_p
的特殊属性,表示它的成员是私有的。从对象文字中可以通过this._p
访问它。但是,当我将对象文字传递到“外部”范围时,我不复制_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);
答案 0 :(得分: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
}
});