我正在外壳内创建一个对象。外壳中还有对象函数可以访问的私有(private)属性 - 这按预期工作。
我的问题:我希望其他人能够使用他们自己的功能(来自不同上下文的功能)扩展我的对象,但这些功能也需要访问相同的私有(private)属性 - 我一直无法找到一种使这项工作有效的方法。
我已经尝试了 .call 的各种配置,并将它们的函数包装在一个新函数中,等等。我觉得我已经接近解决方案,但还不够。
这里有一些简化的示例代码,可以准确反射(reflect)我的情况:
//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
编辑:感谢大家的回复。我完全理解这些属性作为公共(public)属性更容易访问,否则通常继承的对象将无法访问它们。但是,由于新函数附加到原始对象,我不得不相信有一种方法可以使用原始上下文,而不是创建新函数的上下文。
现在,我是第一个说 eval 是邪恶的人 - 事实上,我以前从未使用过它,甚至没有考虑过使用它。但是,我正在尝试我能想到的一切来完成这项工作——我偶然发现了这个(看似)有效的解决方案:
obj3.fn2 = eval(obj1.fn2.toString());
因此,如果我检查以确保 obj1.fn2 是一个 typeof 函数,这是否有可能对我的代码有害?它不执行函数,所以我看不出如何执行 - 但也许我遗漏了什么?
最佳答案
Javascript 没有“ protected ”的类似物。您要么变得 super 私密,要么完全公开。从这里您可以选择:
重新考虑你的类设计,让子类只依赖于父类的公共(public)接口(interface)。
将 getter 和 setter 函数添加到公共(public)接口(interface)。不一定是最好的事情,因为您也可以将属性公开(除了最佳实践问题和诸如此类的问题)
只需使用公共(public)属性即可。这是在 Javascript 中进行 OO 继承的“自然”方式,如果您使用诸如在名称开头添加下划线之类的方法,通常不会有问题。作为奖励,您可以使用原型(prototype)继承功能(很高兴知道如何使用它而不是仅使用基于闭包的类)
function Base(){ this._priv = "Hello world" }; Base.prototype = { fn: function(){ console.log(this._priv); } } var obj2 = new Base(); obj2.fn = function(){ ... }
关于javascript - 您可以使用也可以访问这些私有(private)属性的函数来扩展一个可以访问私有(private)属性的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224372/