Babel中的Javascript代理支持

All*_*ate 22 javascript proxy babeljs

我正在使用babelify版本6.3.0设置为第0阶段.ES6/ES7工作得很好.但是当我尝试使用Javascript的代理功能时:

set product(product={}) {
  this._product = new Proxy({}, {})
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

ReferenceError: Can't find variable: Proxy
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Mik*_*uck 30

来自Babel网站:

由于ES5的限制,代理不能被转换或填充.请参阅各种JavaScript引擎中的支持.

  • @trusktr从技术上讲,是的,但正如创作者所说的那样"不适合生产环境,因为性能影响巨大." 它们通过调用特殊函数替换每个属性访问. (7认同)
  • 嗯,这很不幸.Chrome团队发布了一个polyfill:https://github.com/GoogleChrome/proxy-polyfill,以防万一. (3认同)
  • 根据这个软件包显然在ES5中是**可行的:https://www.npmjs.com/package/babel-plugin-proxy (3认同)

Die*_*ero 5

您不能用所有陷阱代理一个完整的对象,但您至少可以为 get 和 set 创建代理属性。

var proxy = {}

Object.defineProperty(proxy, 'a', {
  get: function() { return bValue; },
  set: function(newValue) { bValue = newValue; }
});
Run Code Online (Sandbox Code Playgroud)

你甚至可以把它包装在一个方法周围

function proxyVar(obj, key, initVal) {
  Object.defineProperty(obj, key, {
    get: function() { return bValue*2; },
    set: function(newValue) { bValue = newValue; }
    value: initVal
  });
}
Run Code Online (Sandbox Code Playgroud)

进而:

var proxy = {}

proxyVar(proxy, 'a', 10)

console.log(proxy.a) // prints 20
proxy.a = 20
console.log(proxy.a) // prints 40
Run Code Online (Sandbox Code Playgroud)