Объект Javascript получает код в виде строки

Во-первых, прошу прощения, если это дубликат, но каждый раз, когда я искал в Google 'объект' и 'код' у меня есть наставник ial pages.

Я хочу знать, есть ли простой способ получить код, связанный с объектом. Что-то вроде

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*/);"

, но, как большинство из вас уже знаете, все, что выводится, это что-то вроде "Object". Я почти нашел способ обойти это, поместив инициализацию в функцию вроде этой

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*/);
}"

, но это сбивает с толку, а затем мне нужно войти и начать анализ строки, чего я не хочу делать.

EDIT : Причина, по которой я все это спрашиваю, заключается в том, что я хочу сделать код, который одновременно является динамически исполняемым и очень модульным. Имею дело с холстом. Я хочу, чтобы пользователь мог щелкнуть, например, прямоугольник, просмотреть его код, изменить, а затем загрузить / выполнить его. У меня есть ряд правил, но в основном у меня есть класс формы, и все, что определяет эту форму (цвет, прозрачность, заливки, штрихи ...), должно быть передано в качестве параметра к сознтруктору объекта, примерно так:

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) Мне нужно вручную удалить оболочку функции () и завершающую } , а также сдвинуть каждую строку влево на одну вкладку. 2) нет гарантии, что пользователь не забудет включить функцию-оболочку, поскольку она совершенно не нужна для рисования. Я пытаюсь придумать способ, при котором обертка казалась бы естественной, но я не могу придумать ничего. Но опять же, я не спал более 30 часов.

13
задан tshepang 24 April 2014 в 18:58
поделиться