【发布时间】:2011-08-28 22:24:21
【问题描述】:
我正在外壳内创建一个对象。外壳中还有对象的函数可以访问的私有属性 - 这可以按预期工作。
我的问题:我希望其他人能够使用他们自己的函数(来自不同上下文的函数)扩展我的对象,但这些函数也需要访问相同的私有属性 - 我无法找到一种使这项工作发挥作用的方法。
我尝试了 .call 的各种配置,并将它们的功能包装在一个新功能中,等等。我觉得我已经接近解决方案了,但还差强人意。
这里有一些简化的示例代码,准确地反映了我的情况:
//extension object
//fn2 can be any function, with any number of arguments, etc.
var obj1 = {};
obj1.fn2 = function (s1, s2){ console.log(priv); };
//actual object
var obj2 = (function (){
//private property
var priv = "hello world";
//return object
var obj3 = {};
//return object's native fn (works)
obj3.fn = function (s){ console.log(priv); };
//extension happens here - but is obviously not correct
obj3.fn2 = obj1.fn2;
//return object
return obj3;
})();
//try output
obj2.fn("goodbye world"); //works
obj2.fn2("goodbye world", "thx 4 teh phish"); //fails
任何见解将不胜感激。而且我完全理解我想要的东西是否不可能 - 但它确实看起来应该是:P
编辑:感谢大家的回复。我完全理解这些属性更容易作为公共访问,并且通常继承的对象将无法访问它们。但是,由于新函数被附加到原始对象,我必须相信有一种方法可以使用原始上下文,而不是创建新函数的上下文。
现在,我是第一个说 eval 是邪恶的 - 事实上,我之前从未使用过它,甚至考虑过使用它。但是,我正在尽我所能来完成这项工作 - 我偶然发现了这个(看似)有效的解决方案:
obj3.fn2 = eval(obj1.fn2.toString());
那么,如果我检查以确保 obj1.fn2 是一个 typeof 函数,有什么方法可能对我的代码有害吗?它不执行该功能,所以我看不出如何 - 但也许我错过了什么?
【问题讨论】:
-
请参阅此处:stackoverflow.com/questions/7223667/…,了解有关访问私有属性的相关讨论。
标签: javascript scope