- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试用 JavaScript 编写完全自动化的单元测试,并且正在寻找一种方法来读取各种 JS 函数中的一些私有(private)变量。我想我想起了一种将特权成员注入(inject)函数/对象的方法(并发现“在 JS 中没有私有(private)这样的东西”的压倒性出现)但我找不到任何资源来说明如何做。
我正在尝试通读 .prototype
的属性,但如果有办法,这里的人会比我自己找到的更快地知道将我指引到哪里。
谢谢
特权是指可从对象外部使用并有权读取“私有(private)”变量(否则无法从外部读取的变量)的函数。参见 http://javascript.crockford.com/private.html Crockford 的解释。
我尝试注入(inject)的函数示例是 o2
,我需要在其中验证 x
的值(这是一个简化的示例,实际代码会进行一些转换并将它们发送到我计划单独测试的其他函数)。
var o2 = function() {
var x = 'me';
};
更新 2:感谢所有花时间回复的人。我看到这里压倒性的 react 是“私有(private)就是私有(private)”,尽管我在其他 SA 问题中看到人们说“JS 中没有什么是私有(private)的”的评论。我想这更像是修辞评论,而不是我希望的是对我还不知道的潜在漏洞的某种洞察。
最佳答案
即使我们尽力帮助您,您问题的正确答案也很简单:
如果我们可以直接从闭包外部访问闭包变量会有什么好处?
如果您有一个带有私有(private)变量的对象,它们将无法在函数闭包之外访问,也就是构造函数。
var c = function() {
var priv = "private";
this.get = function() {
return priv;
};
}
var o = new c();
o.injected = function() {
return priv; // ERROR!!!!!! priv doesn't exist in function scope
};
当然,如果你将整个东西都包含在一个函数闭包中,那当然是另一回事,但是你不会有对象私有(private),而是函数闭包 internals 将在这个函数中的所有原型(prototype)之间共享关闭。
(function(){
var intrn = "internal";
// omit "var" to make it global
c = function() {
this.get = function() {
return intrn;
};
};
// omit "var" to make it global
o = new c();
o.injected = function() {
return intrn; // WORKS
};
})();
o.injected();
但这不同于对象私有(private)...
关于javascript - 有没有办法在构造对象后注入(inject)特权方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10020445/
我是一名优秀的程序员,十分优秀!