Доступ к внутренним переменным в 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, может привести к сбою исходного объекта, если вы не инициализируете свежий экземпляр.

Другие вопросы по тегам