gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:52:37 26 4
gpt4 key购买 nike

我正在外壳内创建一个对象。外壳中还有对象函数可以访问的私有(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com