You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Neil Fraser的JS-Interpreter中为String原型添加方法?

在JS-Interpreter中为String原型添加自定义方法

完全可以给JS-Interpreter的String原型添加自定义方法,你之前的代码核心问题是错误地使用了原生String原型来映射解释器内部对象,另外还有一处拼写错误。以下是修正后的实现方案:

错误原因分析

  1. interpreter.nativeToPseudo(String.prototype)无法获取到解释器内部的String原型对象——JS-Interpreter维护了一套独立的内部对象系统,原生JS对象和解释器伪对象不能直接这样映射。
  2. 代码中myIntepreter.value存在拼写错误,应为myInterpreter.value。
  3. 自定义方法中直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:05:32