带有受保护变量的javascript继承

时间:2012-02-04 05:27:58

标签: javascript oop

是否有可能在javascript中有一个无法访问类的函数的变量,但是能够由继承它的类访问它?即:

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 个答案:

答案 0 :(得分:3)

没有。原型继承仅限于对象的属性。

构造函数中的变量仅可用于该变量范围内的其他代码。

你可能想出类似的东西......

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

答案 1 :(得分:2)

我认为您需要使用闭包来实现您的尝试。像这样:

            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中实现与在没有所有额外关键词的基于类的语言中相同的东西。 Douglas Crockford(总是很好地咨询javascript)解释了原型继承here

修改

刚看了一下你的问题。如果你想在你的类中新创建的方法来访问基类中的变量,那么你必须在你自己的方法中调用getVar方法。就像这样:

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


                   console.log(Cl2.getVar2()) //outputs 4