Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:从基类继承方法并返回子类';s私有变量_Javascript_Oop_Inheritance - Fatal编程技术网

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对象模型与不可互操作的作用域变量混合使用*

继承了doing
SubClass.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对象模型与不可互操作的作用域变量混合使用*

继承了doing
SubClass.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
      方法。给他们一个自己的!为此,可以在上应用父构造函数