Javascript:从基类继承方法并返回子类';s私有变量
我定义了以下基类:Javascript:从基类继承方法并返回子类';s私有变量,javascript,oop,inheritance,Javascript,Oop,Inheritance,我定义了以下基类: function BaseClass (arg1,arg2,arg3) { //constructor code here then - var privateVar = 7500; this.getPrivateVar = function() { return privateVar; }; } 我希望有以下子类,它允许像这样更改privateVar: function SubClass (arg1,arg2,arg3,privateVar) {
function BaseClass (arg1,arg2,arg3) {
//constructor code here then -
var privateVar = 7500;
this.getPrivateVar = function() { return privateVar; };
}
我希望有以下子类,它允许像这样更改privateVar:
function SubClass (arg1,arg2,arg3,privateVar) {
//constructor code here then -
var privateVar = privateVar;
}
SubClass.prototype = new BaseClass();
现在我希望子类继承getPrivateVar
方法。但是,当我尝试此操作时,它总是返回7500
,这是基类中的值,而不是privateVar
的值
换句话说,是否可以继承基类的公共方法,但其中的任何引用都引用子类的属性?我该怎么做呢
听上去,这是不可能的。我的想法是为我的学生代码自动化一个代码检查器(我辅导孩子们),但我必须找到另一种方法。谢谢。
privateVar
是基类的局部变量。子类不能继承或更改它
您可以将父类和子类封装在同一范围内,如下所示:
(function(){
var privateVar = 7500;
function BaseClass (arg1,arg2,arg3) {
//constructor code here then -
this.getPrivateVar = function() { return privateVar; };
}
function SubClass (arg1,arg2,arg3,privateVar) {
//constructor code here then -
}
SubClass.prototype = new BaseClass();
return SubClass;
})();
privateVar
是BaseClass
的局部变量。子类不能继承或更改它
您可以将父类和子类封装在同一范围内,如下所示:
(function(){
var privateVar = 7500;
function BaseClass (arg1,arg2,arg3) {
//constructor code here then -
this.getPrivateVar = function() { return privateVar; };
}
function SubClass (arg1,arg2,arg3,privateVar) {
//constructor code here then -
}
SubClass.prototype = new BaseClass();
return SubClass;
})();
您定义privateVar的方式使其成为基类“构造函数”范围内的局部变量。正如Neal所说,您不能从任何继承的类继承或“看到”它。
您可以使用Neal所说的闭包(但这可能是内存过度消耗,具体取决于您的使用上下文),或者将变量设置为实例变量:
function BaseClass (arg1,arg2,arg3) {
//constructor code here then -
this.privateVar = 7500;
this.getPrivateVar = function() { return this.privateVar; };
}
function SubClass (arg1,arg2,arg3,privateVar) {
//constructor code here then -
this.privateVar = privateVar;
}
SubClass.prototype = new BaseClass();
var subClass = new SubClass(1,2,3,4000);
console.log(subClass.getPrivateVar());
您定义privateVar的方式使其成为基类“构造函数”范围内的局部变量。正如Neal所说,您不能从任何继承的类继承或“看到”它。
您可以使用Neal所说的闭包(但这可能是内存过度消耗,具体取决于您的使用上下文),或者将变量设置为实例变量:
function BaseClass (arg1,arg2,arg3) {
//constructor code here then -
this.privateVar = 7500;
this.getPrivateVar = function() { return this.privateVar; };
}
function SubClass (arg1,arg2,arg3,privateVar) {
//constructor code here then -
this.privateVar = privateVar;
}
SubClass.prototype = new BaseClass();
var subClass = new SubClass(1,2,3,4000);
console.log(subClass.getPrivateVar());
您将Javascript对象模型与不可互操作的作用域变量混合使用*
继承了doingSubClass.prototype=new BaseClass()的习惯用法代码>仅在自然使用原型和构造函数时有效:
function BaseClass(arg1, arg2, arg3) {
this._privateVar = 7500;
}
BaseClass.prototype.getPrivateVar = function() {
return this._privateVar;
};
function SubClass(arg1, arg2, arg3, privateVar) {
}
SubClass.prototype = new BaseClass();
//Better way to do it is
//SubClass.prototype = Object.create(BaseClass.prototype);
SubClass.prototype.constructor = SubClass;
在您认为任何人都可以通过编写\uuu
来访问该属性之前,我可以反驳说,任何人都可以通过使用反射来访问Java、PHP或C中的任何私有文件。或者在Ruby中使用instance\u eval
或send
,等等。所以不管怎么说,这都不是你能控制的
*根据实现使用范围变量时,这些变量中的任何一个或大多数都不起作用:
- 可枚举性
- 可写性
- 第一类存取器
- 密封性、起泡性和延伸状态
- 通过GetPropertyName或键进行反射
- instanceof运算符
- 通用方法
- 继承权
您将Javascript对象模型与不可互操作的作用域变量混合使用*
继承了doingSubClass.prototype=new BaseClass()的习惯用法代码>仅在自然使用原型和构造函数时有效:
function BaseClass(arg1, arg2, arg3) {
this._privateVar = 7500;
}
BaseClass.prototype.getPrivateVar = function() {
return this._privateVar;
};
function SubClass(arg1, arg2, arg3, privateVar) {
}
SubClass.prototype = new BaseClass();
//Better way to do it is
//SubClass.prototype = Object.create(BaseClass.prototype);
SubClass.prototype.constructor = SubClass;
在您认为任何人都可以通过编写\uuu
来访问该属性之前,我可以反驳说,任何人都可以通过使用反射来访问Java、PHP或C中的任何私有文件。或者在Ruby中使用instance\u eval
或send
,等等。所以不管怎么说,这都不是你能控制的
*根据实现使用范围变量时,这些变量中的任何一个或大多数都不起作用:
- 可枚举性
- 可写性
- 第一类存取器
- 密封性、起泡性和延伸状态
- 通过GetPropertyName或键进行反射
- instanceof运算符
- 通用方法
- 继承权
你不会的。即使你可以,也不能再叫它“私人”了。也许是“受保护的”
缺乏不同访问级别的语言只使用公共属性和某种命名约定(比如称它们为_semiprovatevar)
有一些不同的解决方案,但它们并不是真正可以用OO来描述的(你真正拥有的不是类和属性,而是构造函数、作用域和变量)。你不会。即使你可以,也不能再叫它“私人”了。也许是“受保护的”
缺乏不同访问级别的语言只使用公共属性和某种命名约定(比如称它们为_semiprovatevar)
有一些不同的解决方案,但它们不是真正可以用OO来描述的(您真正拥有的不是类和属性,而是构造函数、作用域和变量)
继承基类的公共方法,但其中是否有引用子类的属性
不,那是不可能的。在
基类
构造函数范围内创建的方法将始终引用该范围内的变量,您不能更改它。它是一个变量,不是对象的属性
然而,你做的继承是错误的。您有一个基类
实例,从中继承,所有子类
实例将与之共享其getPrivateVar
方法。给他们一个自己的!为此,可以在子实例上应用父构造函数,创建新的闭包范围和新方法。还有
继承基类的公共方法,但其中是否有引用子类的属性
不,那是不可能的。在基类
构造函数范围内创建的方法将始终引用该范围内的变量,您不能更改它。它是一个变量,不是对象的属性
然而,你做的继承是错误的。您有一个基类
实例,从中继承,所有子类
实例将与之共享其getPrivateVar
方法。给他们一个自己的!为此,可以在上应用父构造函数