javascript - 您可以使用也可以访问这些私有(private)属性的函数来扩展一个可以访问私有(private)属性的对象吗?

标签 javascript scope

我正在外壳内创建一个对象。外壳中还有对象函数可以访问的私有(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 私密,要么完全公开。从这里您可以选择:

  1. 重新考虑你的类设计,让子类只依赖于父类的公共(public)接口(interface)。

  2. 将 getter 和 setter 函数添加到公共(public)接口(interface)。不一定是最好的事情,因为您也可以将属性公开(除了最佳实践问题和诸如此类的问题)

  3. 只需使用公共(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/

相关文章:

javascript - 在 JavaScript 中返回私有(private)变量

javascript - 获取 contenteditable div 的当前行?

javascript - 脚本在任何基于 WebKit 的浏览器中都可以正常工作,但在 Firefox 中却不行

javascript - 如何访问 XUL Overlay 的 DOM

AngularJS 中工厂内的 JavaScript 作用域

jquery - 将 jquery 选择限制为特定形式

javascript - Bootstrap 中的列高度

javascript - 如何在angular js中进行路由?

AngularJS 隔离范围与集合不起作用

java - 尝试在使用 if/else 的同时实现评分系统。 [JAVA]