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继承范围问题_Javascript_Oop_Prototypal Inheritance - Fatal编程技术网

Javascript继承范围问题

Javascript继承范围问题,javascript,oop,prototypal-inheritance,Javascript,Oop,Prototypal Inheritance,我正在尝试使用“伪经典继承”风格来了解JS继承。我做过很多谷歌搜索,读过经典文章。我熟悉Java的类结构,并试图理解JS的原型风格。我正在寻找vanilla JS,因为我想先了解基础知识 我有一个简单的父/子测试类设置,需要一些关于范围规则的帮助 1.)我什么时候定义类内方法和类外方法 2.)使用原型样式创建方法时,如何访问私有变量和私有函数 function superClass(name){ this.name = name; var privateValue = "I'm Priv

我正在尝试使用“伪经典继承”风格来了解JS继承。我做过很多谷歌搜索,读过经典文章。我熟悉Java的类结构,并试图理解JS的原型风格。我正在寻找vanilla JS,因为我想先了解基础知识

我有一个简单的父/子测试类设置,需要一些关于范围规则的帮助

1.)我什么时候定义类内方法和类外方法

2.)使用原型样式创建方法时,如何访问私有变量和私有函数

function superClass(name){
  this.name = name;
  var privateValue = "I'm Private";
  this.outputPrivate2 = function(){
    alert(privateValue); //works fine
  }      
}

superClass.prototype.outputPrivate = function(){
alert(this.privateValue); //outputs undefined..   
    alert(superClass.prototype.privateValue) //also undefined  
}
3.)子对象如何调用私有函数或访问父对象的私有变量

4.)子对象应在何时手动调用父构造函数

subClass2.prototype = new superClass();                // Define sub-class
subClass2.prototype.constructor = subClass2;

function subClass2(name) {
this.name = name;
this.Bye = function() {
return "Bye from subClass - " + this.name;
}   
this.testm = function(){
superClass.prototype.SomeParentMethod.call(this, "arg1", "arg2");
}
}


我有三个对象,其中80%的代码是重复的,所以我创建了一个父对象和三个子对象。子对象具有使用和操作来自父对象的私有数据的方法。我唯一能做到这一点的方法就是公开所有我不喜欢的变量。再说一次,我对Java很熟悉,所以我可能太努力了,无法让JS像Java一样工作

这里介绍了一些面向对象JavaScript的有趣之处

1) 在类中定义方法时,每次调用构造函数时都会创建一个新函数。如果使用大量对象,这可能会导致性能问题。将方法附加到原型对象时,函数只创建一次

2) 但是在构造函数中定义函数的优点是可以使用“私有”方法/属性。在Javascript中,实际上没有私有变量之类的东西。相反,您正在创建一个包含一些变量的闭包

如果您需要在构造函数之外使用这些变量,则需要将它们公开

3) 同样的问题

4) 虽然你的问题不是很清楚,但我会这样做:

function parent(){
    this.a = 1;
}

function child(){
    parent.call(this);
    this.b = 2;
}

obj = new child();
// now obj.a == 1, obj.b == 2

可以访问构造函数范围内定义的变量和函数的唯一方法是通过Closure访问它们。您可以提供一个如何访问“privateValue”的示例吗?它不需要在构造函数中。我可以创建一个包含我需要的私有数据的setup或init方法。基本上我有很多方法需要共享的内部数据~
function parent(){
    this.a = 1;
}

function child(){
    parent.call(this);
    this.b = 2;
}

obj = new child();
// now obj.a == 1, obj.b == 2