Доступ к внутренним переменным в JavaScript
Я пишу usercript для какого-то сайта. Мне нужно получить доступ к внутренней переменной в функции. Например, в следующем коде мне нужно получить доступ к "частной собственности" b объекта c
function a(){
var b;
//assignment to b and other stuff
};
var c=new a();
Я НЕ МОГУ ИЗМЕНИТЬ КОД САЙТА, Я ТОЛЬКО МОГУ ИЗМЕНИТЬ ПИСЬМО РАСШИРЕНИЯ BORWSER И НАПИСАТЬ ПОЛЬЗОВАТЕЛЬСКИЙ СКРИПТ. Мой браузер - последняя версия Firefox. Мне нужно получить доступ, даже если бы мне пришлось изменить Scriptish.
3 ответа
Вы не можете получить доступ к своей внутренней переменной своей функции, вы должны сделать ее глобальной переменной, чтобы получить ее извне.
var b;
function a(){
b=1;
//assignment to b and other stuff
};
var c=new a();
document.write(c.b);
и на выходе будет 1.
В вашем коде b
не частная переменная, а локальная переменная. И после исполнения var c=new a();
б больше не существует. Таким образом, вы не можете получить к нему доступ.
Но если вы используете замыкания, все меняется:
function a(){
var b;
//assignment to b and other stuff
this.revealB = function() {
return b;
}
};
var c = new a();
alert(c.revealB());
Вот b
все еще является локальной переменной, но ее время жизни зависит от замыкания, поэтому оно остается живым, когда мы вызываем revealB
,
Это довольно простая вещь, и она отлично подходит для приложений наследования:
Вы просто возвращаете все, что хотите, и, возможно, возвращаете это через методы, а затем повторно используете это в других функциях и наращиваете его.
Пример следует:
function a(){
var b;
//assignment to b and other stuff
return b;
};
// or
function a(){
var b, result;
//assignment to b and other stuff
returnInitial: function() {
return b;
}
// other stuff with b
return result;
};
Позже вы можете использовать так называемое "паразитическое наследование" и инициировать всю эту функцию внутри другой функции, используя все локальные переменные и добавляя новые методы, например, так:
var a function() {
var b, result;
//assignment to b and other stuff
returnInitial: function() {
return b;
}
// other stuff with b
return result;
}
var extendedA function() {
var base = new a;
var b = a.returnInitial();
a.addToB = function (c) {
var sum = c + a.returnInitial();
return sum;
}
}
Так что теперь вы можете получить
var smt = new extendA();
var c = 12; //some number
var sumBC = extendA.addToB(c);
Для всех этих замечательных практик я рекомендую yutube поиск лекций Дуга Крокфорда об обработке объектов js.
Обратите внимание, что вам нужно использовать new, поскольку обработка динамических объектов, которую использует javascript, может привести к сбою исходного объекта, если вы не инициализируете свежий экземпляр.