在Safari

时间:2017-09-03 10:23:12

标签: javascript proxy safari ecmascript-6

我刚刚发现当前iOS尚不支持ES2015和Proxy。我的代码中有一个非常小的Proxy对象,我用它来允许在访问myobject.non_formally_defined_property时调用函数,其中我没有为属性定义明确的属性或属性getter。问题

我如何实现与ES2015兼容的类似代理的行为?我希望继续保持原样。 (重构可能是~20行代码,但结果将是 mess - 我正在使用它来实现运行配置/状态的初始化时间值。)

在了解defineProperty之后,我尝试将所有属性访问使用相同的函数进行连接,但我对它不起作用的特定方式感到非常困惑。

具体来说,我这样做了:

'use strict';

var arr = {
  one: 1,
  two: 2,
  three: 3
}

var obj = {};

for (var item in arr) {
  Object.defineProperty(obj, item, {
    get: function (value) {
      var local1 = item;
      var local2 = (' ' + item).slice(1);
      console.log('get: item=' + item + '  local1=' + local1 + "  local2=" + local2);
    },
  });
}

obj.one;
<pre id=log></pre>

如果您点击运行代码,您会看到console.log()打印item=three local1=three local2=three

这对我来说非常困惑,因为

  • 我不我正在覆盖setter - 我在同一个对象上运行defineProperty,是的,但在另一个item上每一次 - 所以关闭应该是不同的,对吧? - 但我看到

    我可以解释的唯一方法是

    • 这是最后一个闭包(覆盖其他闭包?)的最终循环值,或者

    • itemlocal1local2以某种方式从父词法范围中被捕获,当然它们都是来自最终循环的所有three迭代。 这没有任何意义,因为......

  • ... var创建独立的本地范围变量。为了确保local*变量是唯一的,我local1是一个简单的=关联,local2是一个“深层复制”黑客,我抓住了from here如果复制的字符串通过引用原始链接。

因此,根据我能想到的每个指标,闭包应该是不同的,我应该看到正确的变量出现。我很好奇理解为什么我的方法不起作用,但我特别想知道如何让getter / setter工作!

请注意,我想要获取和设置功能,但我只是为了简单起见而讨论过这里。

我不想使用任何库。在我的情况下,这是因为JavaScript代码进入HTML文件我通过电子邮件发送给某人,我只想通过电子邮件发送一个文件,有些预生成HTML中其他地方的表已经使用300KB +。

0 个答案:

没有答案