如何使用 javascript 元编程实现 Thing 类?-灵析社区

强哥喝假酒

问题来自于[codewars The builder of things](https://link.segmentfault.com/?enc=nc5rvEW%2FVPC95ltC06Zu6A%3D%3D.ET9zgztamRR4vYb51nQUTNP%2BfdbaJenm9axMcllAFB%2FlVWBApAPA6Qay%2B7S7R4tZUGv%2B8ren%2FKrCKOtguYWl985NIo%2BpZMkiXeErO5Pav7U%3D) 要求我们实现一个Thing类,其中一点要求如下所示: describe('#can', function(){ describe('jane.can.speak(phrase => `${name} says: ${phrase}!`)', function(){ it('should create a speak method on jane', function(){ const jane = new Thing('Jane'); jane.can.speak(phrase => `${name} says: ${phrase}!`); expect(jane.speak('hello')).to.equal('Jane says: hello!'); }); }); 难点是这里的`name`的值从哪里找啊? 我想到的一个方案是使用`with`,但是codewars上使用的是严格模式,不能使用`with`。 class Thing { // TODO: Make the magic happen /* const jane = new Thing('jane'); console.log(jane.name) => 'jane' */ constructor(name) { this.name = name; /* can jane.can.speak(phrase => `${name} says: ${phrase}!`) jane.speak('Hello') => 'jane says: Hello!' where to find name ? => this */ this.can = { speak: (callback) => { this.speak = (...args) => { let res; with(this) { res = callback(...args); }; return res; } } } }

阅读量:112

点赞量:0

问AI
我有一计: class Thing { constructor(name) { this.name = name; globalThis.name = name; } } 当然更好的做法是通过 "Proxy" 拦截 "can" 的 "getter",在得到 "speak" 属性之前设置 "globalThis.name","speak" 函数调用之后还原 "globalThis.name"。 也有其它做法: "Github gist" (https://gist.github.com/nramirez/625fdcf5cf3e2697242befd4417225a6): const funcStr = callback.toString() const finalFunc = eval(funcStr)