首先,很抱歉,如果这是重复的,但是每次我用Google搜索“对象”和“代码”时,我都会得到教程页面。

我想知道是否有任何简单的方法来获取与对象关联的代码。就像是

function A(){
  this.name = 'Kaiser Sauze';
}
a = new A();
console.log(a.displayCode());
//OUTPUT
"function A(){ this.name = 'Kaiser Sauze';}"

我希望能够从浏览器中查看代码,对其进行修改并重新加载该函数。我想知道是否有某种方法可以执行此操作,或者是否必须通过执行以下操作来启动泵:
function A(){
  this.name = 'Kaiser Sauze';
  this.code = "function A(){ this.name = 'Kaiser Sauze';}"
}

然后每次用户加载文本编辑器以查看this.code时,我都会连接onchange以更新this.code

编辑

事实证明,洋基提出了一个简单的解决方案
function A(x){
  this.x = x ;
}
console.log(A.toString());
//OUTPUT
"function A(x){
  this.x = x ;
}"

但是在我的实现中,变量“x”可以是一个函数(实际上是一个复杂的对象,包含变量,函数和子对象,我通过调用dojo.mixin来将它们混入),所以我真正想要的是在实例化时知道代码,像这样
function A(x){
  this.x = x ;
}
var a = new A(function(){/*DO SOMETHING*/);
console.log(a.toString());
//OUTPUT
"var a = new A(function(){/*DO SOMETHING*/);"

但是,正如您大多数人已经知道的那样,输出的所有内容都类似于“对象”。通过将初始化放在类似这样的函数中,我几乎找到了解决此问题的方法
function A(x){
  this.x = x ;
}
function _A(){
  var a = new A(function(){/*DO SOMETHING*/);
}
console.log(_A.toString());
//OUTPUT
"function _A(){
  var a = new A(function(){/*DO SOMETHING*/);
}"

但这令人困惑,然后我必须进入并开始解析我不想做的字符串。

编辑:我问所有这一切的原因是b / c我想使代码既可以动态执行又可以高度模块化。我正在处理 Canvas 。我希望用户能够单击一个矩形,查看其代码,然后进行修改,然后加载/执行它。我有一系列规则,但是基本上我有一个shape类,所有定义该形状的内容(颜色,透明度,填充,笔触...)都必须作为参数传递给对象cosntructor,例如:
rect = new Shape({color : 'rgba(0,0,0,1)' ,
  x : 0 ,
  y : 0 ,
  w : 100 ,
  h : 100 ,
  draw : function() {ctx.fillStyle = this.color;
    ctx.fillRect(this.x,this.y,this.w,this.h);
  }
});

通过这种方式,代码可以自动模块化,我不必担心在页面顶部定义颜色,然后在页面中间定义高度,等等。现在,我唯一需要做的就是以某种方式将初始化的整个上述字符串表示形式作为参数传递。我可以将其包装在一个函数中,然后像这样调用toString。
function wrapper(){
  rect = new Shape({color : 'rgba(0,0,0,1)' ,
        x : 0 ,
        y : 0 ,
        w : 100 ,
        h : 100 ,
        draw : function() {ctx.fillStyle = this.color;
          ctx.fillRect(this.x,this.y,this.w,this.h);
        },
        code : wrapper.toString()
      });
  }

但是然后有两个问题。 1)我必须手动删除function wrapper()和尾随的},以及将每一行向左移动一个标签。 2)不能保证用户会记得包括包装器功能,因为对于绘图而言,包装器功能完全不必要。我正在尝试一种看起来包装自然的方法,但是我什么也没想到。但是话又说回来,我还没有睡超过30个小时。

最佳答案

好的...再次审查...我想这就是您想要的;-)。

>>> function A() {this.name ="foo";}
undefined
>>> A.toString()
"function A() {this.name ="foo";}"

10-07 19:02
查看更多