- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我阅读有关 ES6 代理的内容时,它似乎很容易理解,直到我看了 this example。 .
我被难住了。我不明白他们使用的“湿/干”术语,而且我不知道什么时候我会遇到一个理想选择的情况,尤其是因为我似乎找不到一个。
有人可以简要说明这种情况会发生在哪种情况下吗?
最佳答案
首先,了解一些基础知识:对象是属性的集合(其中一些是函数,正式名称为“方法”)。这听起来很明显,但很重要:您可以通过对象和属性名称引用其他值。
代理允许您重写通过(包含)对象的元组和属性名称引用其他值的规则。例如,您可以将“私有(private)”成员隐藏在代理后面。
但假设您有一个循环对象引用。例如,
var x = { z: function() { throw new Error("This shouldn't be callable"); };
var X = /* proxy representing x, where X.z is hidden and cannot be called */;
var y = { x: x };
x.y = y;
或者在文档对象模型术语中,document.documentElement.ownerDocument == document。
在普通代理中,引用 X.y 将返回 y。那里没有什么错......除了 X.y.x === x 和 X.y.x !== X。所以我仍然可以调用:
X.y.x.z(); // throws new Error("This shouldn't be callable")
膜的作用是确保非原始属性(对象和函数)保留这种身份关系,并通过属性查找的任意组合维护您已有的任何代理规则。膜可防止您意外地直接访问各种对象的底层(可能是 native 的)实现。
如果 X 是 x 的基于膜的代理,X.y 将不返回 y。相反,它会返回 y 的代理,我将其称为 Y。Y 公开 y 的属性,就像 X 公开 x 的属性一样。
更重要的是,假设我指的是 X.y.x:
X.y.x === X; // true
X.y.x !== x; // also true
typeof X.y.x.z // returns "undefined", not "function"
X.y.x.z(); // throws TypeError("X.y.x.z is not a function")
通过膜返回对 X(x 的代理)的引用。因此,身份属性得以保留。 (x.y.x === x,所以 X.y.x === X。)
这是最重要的概念:膜意味着您可能永远看不到原始对象,只能看到代表它们的代理对象。
var X = (function() {
var x = { z: function() { throw new Error("This shouldn't be callable"); };
var y = { x: x };
x.y = y;
var X = /* membrane proxy representing x, where X.z is hidden and cannot be called */;
return X;
})();
X.y.x === X; // still true
在Tom van Cutsem's articles on JavaScript Membranes ,其中一个你cited above ,值 x、y 和 x.z 都可以被视为“湿”对象图的一部分,而通过 X 或 Y 引用的任何内容都将是“干”对象图的一部分。 (这里的术语图来自图论,它是离散数学研究的一部分。对象图是指一组相关的对象,而膜是将“ native ”对象集与这些对象的代理集分开的东西。 )
x 和 y 值无法从函数外部直接访问。 (在这个例子中,用 JavaScript 的说法,它们是局部变量,但从膜的 Angular 来看,这在一定程度上是误导的:如果我们谈论的是 DOM 文档,那么在像 Mozilla Firefox 这样的 Web 浏览器中,您真正得到的是DOM 文档,而不是 native 内存中的实际文档对象。无论是局部变量还是插入到您正在运行的 JavaScript 范围内的值,膜及其代理都不会关心。)
相反,您对 x、y 及其属性的唯一访问权限是通过 X 膜代理以及您从 X 获得的任何属性。因为它是一个膜,所以该访问始终是间接的。
至于会发生这种情况的场景:假设您拥有可以执行各种操作的可信代码,例如访问计算机的文件系统。您不希望网页能够直接从文件系统中读取,或者更糟的是,向其中写入。代理膜通过仅公开您打算公开的属性和方法,减少了网页可以使用的 API,因此意外访问该受信任代码的可能性大大降低。这使得安全漏洞变得更加罕见。
最重要的是,如果膜实现是正确的(这比听起来要难得多),网页 JavaScript 不知道或不关心它正在处理代理。网页脚本认为它是处理一个普通的 DOM。这就是我们想要的。
关于javascript - 身份保持膜代理的用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36368363/
我完全不同意配置代理来检查我正在开发的应用程序的 HTTP(S) 流量。我试过运行 Fiddler2 和 Charles Web Proxy,它们都在 127.0.0.1:888 上运行,并使用以下参
我有一个 AWS 环境,其中有几个实例没有预安装 SSM 代理,也没有 key 对,有没有办法在不使用 SSH 登录我的实例的情况下安装 SSM 代理? 在此先感谢您的帮助! 最佳答案 没有。这是一个
在本教程中,您将借助示例了解 JavaScript 代理。 在 JavaScript 中,proxy(代理对象)用于包装对象并将各种操作重新定义到对象中,例如读取、插入、验证等。代理允许您向对
我有一个基于 Martini 的小型应用程序,但遇到了一个我无法解决的问题。 我想添加一个应用程序功能,允许用户从第三个服务器获取文件,并在 HTTP header 中进行一些更改。某种代理。这些文件
结构对比 讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,
我正在尝试代理运行 ELK 的后端服务器。这是我的环境信息: root@proxy:~# root@proxy:~# cat /etc/*release DISTRIB_ID=Ubuntu DISTR
我需要为我的 java 应用程序编写一个代理,它在每个数组创建时执行一些特定的操作。到目前为止,我无法找到在此事件上运行我的代码的任何方法。 java.lang.instrument.ClassFil
PHP 代理如何工作? 我希望制作一个类似于其他 php 代理的小脚本 但是它实际上是如何工作的呢? 最佳答案 我正在考虑一个 PHP 代理,用于绕过 AJAX Sane Origin 策略。如果您需
我有一个 Electron 应用程序,试图通过该应用程序从同一网络调用url,但是出于安全考虑,我考虑了使用代理的想法。 function createWindow () { const mai
我有 1 台计算机,安装了 1 个网卡。网卡有 10 个 IP 地址分配给它。我在那里运行了一个 Windows 桌面应用程序。该应用程序基本上是一个调用 1 个特定网站的网络浏览器。 我想要实现的是
我想将 Burp 配置为我的 java 代码的代理,以查看请求和响应。Burp 作为 Web 浏览器之间的代理可以很好地工作,但它不适用于 Java 应用程序。 我已经在代码中添加了这样的行: Web
据我所知,在Spring AOP中,当我们想要拦截某些方法调用时,我们会配置一个具有与所需方法调用相匹配的切入点配置的Aspect。也就是说,我们在Aspect端配置拦截。 有没有一种方法可以完全从相
这可能是一个常见问题,但是:我有一个正在向 发出请求的应用程序elldmess.cz/api/... 但是这个api已经没有了。 现在我想要“东西”,即 catch 对 elldmess.cz/api
我正在尝试在 Android 中创建代理,但我必须使用套接字。我已经阅读了很多教程并提出了以下代码。不幸的是,浏览器似乎没有获得任何数据,一段时间后它显示标准网页,说网页不可用。可能是什么原因?感谢您
我在使用此代码时遇到了一些问题,具体取决于我使用的浏览器,有些 URL 在 IE 中显示正确,但在 Firefox 中显示为纯文本(例如 www.microsoft.es 在 IE 上看起来不错,但在
我正在尝试通过 urllib 获取一些 url 并通过我的代理进行 Mechanize 。 使用 mechanize 我尝试以下操作: from mechanize import Browser im
我安装了一个嵌入式设备(光伏转换器),它提供了一个正常的 http Web 界面(信息和设置)。该转换器具有用户身份验证,但只能通过 http 进行。出于安全考虑,我不想将服务器直接发布到互联网上。在
我正在搜索有关如何使用支持 HTTPS 的 Ruby 编写代理的一些示例。我有一个使用 Webricks HTTPProxyServer 实现的简单代理,但我注意到,HTTPS 流量只是隧道传输(它应
我的一位客户刚收到他选择的开发商订购的软件,让我看一下并准备托管程序。 这是一个 Java (jar) 应用程序,到目前为止一切顺利......但我看到了一些可疑的东西,软件每隔 60 分钟左右连接到
我试图在 C# 中创建一个 HTTPS 代理服务器。这里有人发布了解决方案: string host = "encrypted.google.com"; string
我是一名优秀的程序员,十分优秀!