Ecmascript 6:如何强制代理get()继承?

时间:2017-09-20 07:38:38

标签: javascript inheritance proxy ecmascript-6 prototypejs

这是我尝试使用的代码(注意:它不是解决方案):

// define main object
class MyObject {}

// set proxy of Object's prototype as prototype of main object
Object.setPrototypeOf( MyObject.prototype, new Proxy( Object.prototype, {
    // implement new get behavior
    get( trapTarget, key, reciever ){
        // throw error if unexistansible variable is tryed to be called
        if ( ! key in trapTarget )
            throw new SyntaxError( 'message' );

        return Reflect.get( trapTarget, key, reciever );
    }
}));

// define new child class
class MyChildObject extends MyObject {}

let child = new MyChildObject();

由于MyObject.protototype代理被引用到Object的原型,我们无法从继承的实例中获取任何属性。

我的代码如何运作:

  • 当我们致电child.unexistansibleVar方法get()将被代理人抓取时
  • 由于代理child.prototype始终为trapTarget,我无法取代Object.prototype,因此所有密钥都会被设法在那里找到

它应该如何运作:

  • 我们致电child.unexistansibleVar
  • 方法get()将由代理
  • 捕获
  • 代理应该获得child并检查if ( ! key in child )

我的问题:

  • 是否可以在代理中收到child
  • 可能有任何不同的方式来实现我的目标吗?

如果我错过了某事或写下了不可理解的东西,请随时问我。

1 个答案:

答案 0 :(得分:0)

class MainClass {
    constructor() {
        return new Proxy( this, {
            get( trapTarget, key, reciever ) {
                if ( ! ( key in trapTarget)  )
                    throw new SyntaxError( 'msg' );

                return Reflect.get( trapTarget, key );
            }
        });
    }
}

class ChildClass extends MainClass {}

let child = new ChildClass();

child.name = 'child object';

console.log( child.name );  // 'child object'
console.log( child.some );  // error 'msg'