标签: es6-proxy

如何使用javascript代理嵌套对象

我在js bin中有这个代码:

var validator = {
  set (target, key, value) {
    console.log(target);
    console.log(key);
    console.log(value);
    if(isObject(target[key])){

    }
    return true
  }
}


var person = {
      firstName: "alfred",
      lastName: "john",
      inner: {
        salary: 8250,
        Proffesion: ".NET Developer"
      }
}
var proxy = new Proxy(person, validator)
proxy.inner.salary = 'foo'
Run Code Online (Sandbox Code Playgroud)

如果我这样做proxy.inner.salary = 555;不起作用.

但是,如果我这样做proxy.firstName = "Anne",那么它的效果很好.

我不明白为什么它不起作用递归.

http://jsbin.com/dinerotiwe/edit?html,js,console

javascript proxy ecmascript-6 es6-proxy

36
推荐指数
3
解决办法
7677
查看次数

我可以使用ES2015课程扩展代理吗?

我试图扩展代理,如下:

class ObservableObject extends Proxy {}
Run Code Online (Sandbox Code Playgroud)

我使用Babel将其转换为ES5,我在浏览器中收到此错误:

app.js:15 Uncaught TypeError: Object prototype may only be an Object or null: undefined
Run Code Online (Sandbox Code Playgroud)

我查看了它指向的代码行.这是代码的一部分,箭头指向有问题的代码行:

var ObservableObject = exports.ObservableObject = function (_Proxy) {
    _inherits(ObservableObject, _Proxy); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    function ObservableObject() {
        _classCallCheck(this, ObservableObject);

        return _possibleConstructorReturn(this, Object.getPrototypeOf(ObservableObject).apply(this, arguments));
    }

    return ObservableObject;
}(Proxy);
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我可能会收到此错误?这是巴贝尔的错误吗?当您尝试扩展代理时应该发生什么?

javascript ecmascript-6 babeljs es6-proxy

32
推荐指数
4
解决办法
7535
查看次数

用于IE11的ES6代理Polyfill

IE11不会也不会实现ES2015代理对象.然而,IE11的延长支持终止于2025年10月14日.

有没有办法为IE11填充代理对象?所有其他浏览器都支持Proxy.

如果是,那么我们今天都可以在生产中使用它.如果没有,那么我们将不得不等待近十年......

编辑:我专门针对IE11,因为我知道IE通常具有我通常不知道的IE特定功能.

Edit2:我特别感兴趣的是能够实现一个全能拦截器.与__getattr__Python 类似.它只需要在IE11中工作.

javascript internet-explorer ecmascript-6 internet-explorer-11 es6-proxy

30
推荐指数
2
解决办法
2万
查看次数

如何从 JavaScript 代理中获取数组

我想知道如何从 JavaScript 中的代理目标值中获取数组。我有这样的东西:

Proxy :
  [[target]] : Array // the array I need to extract
  [[handler]] : Object 
  [[IsRevoked]] : false
Run Code Online (Sandbox Code Playgroud)

javascript arrays target es6-proxy

17
推荐指数
2
解决办法
4万
查看次数

在运行时向控制台方法添加动态值,同时保留原始呼叫位置和行号

我做了下面的课来"劫持"这个console.log功能.这背后的原因是我想动态添加和删​​除值 .它将用于调试目的,因此函数调用起源console.log()很重要.在下面的代码中,我将在评论中解释我的逻辑.

export class ConsoleLog {
  private _isActive = false;
  private _nativeLogFn: any;

  constructor() {

    // ----------------------
    // Store the native console.log function, so it can be restored later 
    // ----------------------

    this._nativeLogFn = console.log;

  }

  public start() {
    if (!this._isActive) {

      // ----------------------
      // Create a new function as replacement for the native console.log 
      // function. *** This will be the subject of my question ***
      // ----------------------

      console.log = console.log.bind(console, …
Run Code Online (Sandbox Code Playgroud)

javascript typescript ecmascript-6 console.log es6-proxy

16
推荐指数
1
解决办法
290
查看次数

从ES6类构造函数返回ES6代理

我希望用户只为对象设置特定属性,但同时应该从自定义类构造该对象.

例如

var row = new Row({
  name : 'John Doe',
  email : 'uhiwarale@gmail.com'
}, Schema);
Run Code Online (Sandbox Code Playgroud)

row可以有方法.但是当用户尝试设置时row.password,不允许这样做.

一种方法是使用new Proxy而不是new Row然后我们将放弃我们在Row课堂上做的所有很酷的事情.我想new Row返回一个代理对象this作为代理目标引用.

有人对此有什么想法吗?如果你知道mongoose,怎么mongoose做呢?

javascript proxy es6-proxy es6-class

15
推荐指数
2
解决办法
6239
查看次数

如何代理自定义元素(Web组件)

class A extends HTMLElement {
  constructor() {
    super()
    return new Proxy(this, {})
  }
}

window.customElements.define('a-element', A)
Run Code Online (Sandbox Code Playgroud)
<a-element></a-element>
Run Code Online (Sandbox Code Playgroud)

我如何代理自定义元素?

当我尝试它:

Uncaught InvalidStateError: custom element constructors must call super() first and must not return a different object.

javascript web-component custom-element es6-proxy es6-class

14
推荐指数
1
解决办法
1034
查看次数

如何从代理对象获取代理的处理程序?

例如,如果我有这个处理程序/代理(来自MDN示例)...

var handler = {
    get: function(target, name){
        return name in target?
            target[name] :
            37;
    }
};

var p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;

console.log(p.a, p.b); // 1, undefined
console.log('c' in p, p.c); // false, 37
Run Code Online (Sandbox Code Playgroud)

是否可以探测代理,p以某种方式允许我获取handler对象.

有点像:

p.__handler__   // returns handler object -> Object {get: handler.get(), set: handler.set(), ...}
p.__handler__.get  // returns get prop/fn of handler -> function(target, name){ ...}
Run Code Online (Sandbox Code Playgroud)

显然,在处理程序中设置的各种陷阱仍然对代理"已知",但有一种明确的方式从代理本身返回它们/处理程序吗?如果是这样,怎么样?

我目前没有具体的用例,但如果您想在已经拥有代理之后动态更改处理程序/陷阱,我可以看到这很有用.

javascript ecmascript-6 es6-proxy

12
推荐指数
2
解决办法
3914
查看次数

JavaScript中的自定义数组类getter

我有一个简单的ES6类,如下所示:

class Ring extends Array {
    insert (item, index) {
        this.splice(index, 0, item);
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想这样做,以便Ring对象的索引包装,所以new Ring(1, 2, 3)[3]返回1,new Ring(1, 2, 3)[-1]返回3,依此类推.这可能在ES6中吗?如果是这样,我将如何实现它?

我已经阅读了代理,它允许完全自定义的getter,但我无法弄清楚如何将代理应用于类.我确实管理了这个:

var myRing = new Proxy (Ring.prototype, {
    get: function (target, name) {
        var len = target.length;
        if (/^-?\d+$/.test(name))
            return target[(name % len + len) % len];
        return target[name];
    }
});
Run Code Online (Sandbox Code Playgroud)

myRing现在是一个支持包装索引的Ring对象.问题是我每次都必须定义像这样的Ring对象.有没有办法将此代理应用于类,以便调用new Ring()返回它?

javascript ecmascript-6 es6-proxy es6-class

10
推荐指数
1
解决办法
657
查看次数

Typescript 编译器不知道类上的 ES6 代理陷阱

我有一个抽象类:

abstract class Foo {
    abstract bar(): string;
}
Run Code Online (Sandbox Code Playgroud)

我有一些扩展的类Foo

class Foo1 extends Foo {
    bar(): string { return 'foo1'; }
}

class Foo2 extends Foo {
    bar(): string { return 'foo2'; }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个类,我要代理的所有方法FooFoo。这实际上工作正常,如果我Foo在这个类上定义所有方法。但我宁愿不这样做。我宁愿让Foo定义的方法Foo和编译器知道FooProxy也实现了这些方法,而不必实际实现它们。这可能吗?Proxy 类看起来像这样:

class FooProxy {
    public foo: Foo;

    constructor(foo: Foo) {
        this.foo = foo;
        let handler = {
            get: function(target: FooProxy, prop: string, receiver: any) {
                if(Foo.prototype[prop] !== null) {
                    return target.foo[prop]; …
Run Code Online (Sandbox Code Playgroud)

typescript es6-proxy angular

10
推荐指数
2
解决办法
7986
查看次数