是否有可能在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
答案 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