编程语言
首页 > 编程语言> > javascript – 有没有办法在构造对象后注入特权方法?

javascript – 有没有办法在构造对象后注入特权方法?

作者:互联网

我正在尝试用JavaScript编写完全自动化的单元测试,我正在寻找一种方法来读取各种JS函数中的一些私有变量.我想我记得有一种方法可以将特权成员注入一个函数/对象(并且发现了“在JS中没有私有这样的东西”的压倒性事件)然而我找不到任何指示如何的资源.

我正在尝试阅读.prototype的属性,但如果有办法,那么有人会知道在哪里指导我的速度比我自己找到的要快.

谢谢

更新

> Privileged表示可以从对象外部使用的函数,并且可以读取“私有”变量(否则无法从外部读取的变量).有关Crockford的解释,请参阅http://javascript.crockford.com/private.html.
>我想要注入的函数的示例是o2,其中我需要验证x的值(这是一个简化的示例,实际代码执行一些转换并将它们发送到我计划测试的其他函数分别).

var o2 = function() {
    var x = 'me';
};

更新2:
感谢所有花时间回应的人.我看到这里压倒性的反应是,“私人是私人的”,尽管我在其他SA问题中看到的评论中,人们说“JS中没有任何东西是私密的”.我想这更像是修辞评论,而不是我希望能够洞察一些我还不知道的潜在漏洞.

解决方法:

正确回答你的问题

即使我们尽可能地帮助您,您问题的正确答案也很简单:

……你做不到

如果我们可以直接从闭包外部访问它们,闭包变量会有什么用呢?

如果你有一个带有私有变量的对象,它们将无法在函数闭包之外访问,这是构造函数.

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

当然,如果你把整个东西都包含在一个函数闭包中,那么你就不会有对象私有,而是函数闭包内部将在这个闭包中的所有原型之间共享.

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

但这与对象私有不同……

标签:javascript,private-members,privileged-functions
来源: https://codeday.me/bug/20190626/1291168.html