наследование JavaScript с защищенными переменными - PullRequest
1 голос
/ 04 февраля 2012

Возможно ли в javascript иметь переменную, которая не имеет доступа к функциям класса, но доступна для классов, которые ее наследуют?IE:

class1 has protected var x = 4;

class2 inherits class1;

class2.prototype.getVar = function(){return /* parent, uber, super, whatever */ this.x;};

var cl2 = new class2();

console.log(cl2.x) // undefined
console.log(cl2.getVar()) // 4

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Нет.Прототипное наследование ограничено свойствами объектов.

Переменные в конструкторе доступны только для другого кода в этой области переменных.

Возможно, вы могли бы придумать что-то вроде ...

function cls1() {
    var a = 'foo';
    this.some_func = function() {
        alert(a);
    };
}

function cls2() {
    cls1.apply(this, arguments);
    var cls1_func = this.some_func;

    var b = 'bar'

    this.some_func = function() {
        cls1_func.apply(this, arguments);
        alert(b);
    };
}

var x = new cls2;

x.some_func();  // alert "foo"  alert "bar"

Или сделать его более конкретным для вашего псевдокода ...

function class1() {
    var x = 4;
    this.getVar = function() {
        return x;
    };
}

function class2() {

    class1.apply(this, arguments);

    var cls1_get_var = this.getVar;

    this.getVar = function() {
        return cls1_get_var.apply(this, arguments);
    };
}

class2.prototype = Object.create( class1.prototype );

var cl2 = new class2;

console.log(cl2.x) // undefined
console.log(cl2.getVar()) // 4
2 голосов
/ 04 февраля 2012

Я думаю, вам нужно использовать замыкание, чтобы добиться того, что вы пытаетесь сделать.Примерно так:

            Class1 = function() {
                var x = 4;
                return {
                    getVar: function() {
                        return x;
                    }
                }
            } ();// executes the function immediately and returns an
                //an object with one method - getVar. Through closure this method
                //still has access to the variable x


            Class2 = function() { };// define a constructor function
            Class2.prototype = Class1;//have it inherit from Class1

            Cl2 = new Class2();//instantiate a new instance of Class2
            console.log(Cl2.x);//this is undefined
            console.log(Cl2.getVar());//this outputs 4

Это одна из замечательных особенностей javascript в том, что в javascript вы можете достичь того же, что и в языке на основе классов, без лишних ключевых слов.Дуглас Крокфорд (всегда полезно проконсультироваться о javascript) объясняет наследование прототипа здесь

Редактировать:

Просто взглянул на ваш вопрос. Есливы хотите, чтобы вновь созданные методы в вашем классе обращались к переменной в базовом классе, тогда вам придется вызывать метод getVar в вашем собственном методе. Например:

              Class2 = function() {
                    this.getVar2 = function() {
                        return this.getVar();
                    }
                };


                   console.log(Cl2.getVar2()) //outputs 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...