Во-первых, я сожалею, если это дубликат, но каждый раз, когда я googled для "объекта" и "кода", я получал учебные страницы.
Я хочу знать, есть ли простой способ получить код, связанный с объектом. Что-то вроде
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: Причина, по которой я прошу все это, - это b/c. Я хочу сделать код, который является динамически исполняемым и очень модульным. Я имею дело с холстом. Я хочу, чтобы пользователь мог щелкнуть по, например, прямоугольнику, просмотреть его код и изменить, а затем загрузить/выполнить его. У меня есть ряд правил, но в основном у меня есть класс формы, и все, что определяет эту форму (цвет, прозрачность, заливки, штрихи...), должно передаваться как параметр объекту 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()
и trailing }
, а также переместить каждую строку влево на одну вкладку. 2) нет гарантии, что пользователь не забудет включить функцию обертки, поскольку она абсолютно не нужна для целей рисования. Я пытаюсь думать о способе, которым обертка казалась бы естественной, но я не могу думать ни о чем. Но опять же я не спал более 30 часов.