如何在Neil Fraser的JS-Interpreter中为String原型添加方法?
在JS-Interpreter中为String原型添加自定义方法
完全可以给JS-Interpreter的String原型添加自定义方法,你之前的代码核心问题是错误地使用了原生String原型来映射解释器内部对象,另外还有一处拼写错误。以下是修正后的实现方案:
错误原因分析
interpreter.nativeToPseudo(String.prototype)无法获取到解释器内部的String原型对象——JS-Interpreter维护了一套独立的内部对象系统,原生JS对象和解释器伪对象不能直接这样映射。- 代码中
myIntepreter.value存在拼写错误,应为myInterpreter.value。 - 自定义方法中直接使用
this会拿到解释器的伪对象,需要转换为原生值才能正确拼接。
修正后的代码
const interpreter = require('js-interpreter'); var initFunc = function (interpreter, globalObject) { // 1. 获取解释器内部的String构造函数 const pseudoString = interpreter.getProperty(globalObject, 'String'); // 2. 获取解释器内部的String原型对象 const stringPrototype = interpreter.getProperty(pseudoString, 'prototype'); // 3. 实现自定义方法的包装函数,处理解释器上下文的this var stringGreetWrapper = function greet() { // 获取解释器中当前的this值,并转换为原生字符串 const nativeThis = interpreter.pseudoToNative(interpreter.getThis()); return "Hi " + nativeThis + "!"; }; // 4. 将自定义方法挂载到String原型上 interpreter.setProperty( stringPrototype, 'greet', interpreter.createNativeFunction(stringGreetWrapper) ); }; var code = 'function foo(name) {return name.greet();}'; var myInterpreter = new interpreter(code, initFunc); myInterpreter.appendCode('foo("John");'); myInterpreter.run(); var res = myInterpreter.value; // 修正拼写错误 console.log(res); // 输出: Hi John!
关键步骤说明
- 获取解释器内部的String原型:必须通过解释器的
getProperty方法从全局对象拿到内部的String构造函数,再取其prototype,这才是解释器中所有String实例继承的原型。 - 处理方法中的this:在自定义方法里,要用
interpreter.getThis()获取当前上下文的this(解释器伪对象),再通过interpreter.pseudoToNative()转换为原生JS值,才能正常操作。 - 挂载方法:使用
interpreter.createNativeFunction()将原生函数包装为解释器可识别的函数,再通过setProperty挂载到原型上。
内容的提问来源于stack exchange,提问作者Georgi Todorov
相关产品推荐
相关产品推荐

