javascript-您可以使用也可以访问这些私有属性的功能扩展可以访问私有属性的对象吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-您可以使用也可以访问这些私有属性的功能扩展可以访问私有属性的对象吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2124字,纯文字阅读大概需要4分钟。
内容图文
![javascript-您可以使用也可以访问这些私有属性的功能扩展可以访问私有属性的对象吗?](/upload/InfoBanner/zyjiaocheng/654/80d654f352ef4dc2b9cc93582363339d.jpg)
我正在机箱内创建对象.外壳中还包含对象函数可以访问的私有属性-这可以按预期工作.
我的问题:我希望其他人能够使用自己的功能(来自不同上下文的功能)扩展我的对象,但是这些功能还需要访问相同的私有属性-我一直无法找到一种方法来使这项工作.
我已经尝试过.call的各种配置,并且还将它们的功能包装在新功能中.我觉得我已经接近解决方案了,但是还差一点.
这是一些简化的示例代码,可以准确反映我的情况:
//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
编辑:谢谢大家的答复.我完全理解,可以更容易地以公共方式访问属性,否则通常继承的对象将无法访问它们.但是,由于新功能已附加到原始对象上,因此我不得不相信有一种方法可以使用原始上下文,而不是使用创建新函数的上下文.
现在,我是第一个说eval是邪恶的人-实际上,我从未使用过,甚至从未考虑过使用它.但是,我正在尽我所能想到的一切来完成这项工作-我偶然发现了这个(貌似)可行的解决方案:
obj3.fn2 = eval(obj1.fn2.toString());
因此,如果我检查以确保obj1.fn2是typeof函数,那么有什么办法可能对我的代码有害吗?它不执行功能,所以我看不到-但是也许我遗漏了一些东西?
解决方法:
Javascript没有“受保护”的类似物.您要么超级私人,要么完全公开.从这里您可以选择:
>重新考虑您的类设计,并使子类仅依赖于父类的公共接口.
>将getter和setter函数添加到公共界面.虽然不一定会是最好的事情,但是您也可以将这些属性公开(除了最佳实践问题之外)
>只需使用公共属性即可.这是在Javascript中进行OO继承的“自然”方法,如果您使用诸如在名称的开头添加下划线之类的捐赠,这通常不是问题.另外,您可以使用原型继承功能(很高兴知道如何使用此功能,而不仅仅是基于闭包的类)
function Base(){
this._priv = "Hello world"
};
Base.prototype = {
fn: function(){
console.log(this._priv);
}
}
var obj2 = new Base();
obj2.fn = function(){ ... }
内容总结
以上是互联网集市为您收集整理的javascript-您可以使用也可以访问这些私有属性的功能扩展可以访问私有属性的对象吗?全部内容,希望文章能够帮你解决javascript-您可以使用也可以访问这些私有属性的功能扩展可以访问私有属性的对象吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。