Javascript继承范围问题

标签 javascript oop prototypal-inheritance

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

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

1.) 什么时候在类中定义方法,什么时候在类外定义方法?

2.) 当我使用原型(prototype)风格创建方法时,如何访问私有(private)变量和私有(private)函数?

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.) 子对象如何调用父对象的私有(private)函数或访问私有(private)变量?

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");
}

}

var parent = new superClass("parent");
var child = new subClass("child1");
parent.outputPrivate(); //undefined
parent.outputPrivate2(); //I'm private
child.outputPrivate(); //undefined
child.outputPrivate2(); //I'm private

我有三个对象,其中 80% 的代码是重复的,因此我创建了一个父对象和三个子对象。子对象具有使用和操作父对象的私有(private)数据的方法。我让它发挥作用的唯一方法是将所有我不喜欢的变量公开。再说一次,我熟悉 Java,所以我可能太努力地让 JS 像 Java 一样工作。

最佳答案

您在这里讨论了面向对象 JavaScript 的一些有趣的观点。

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

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

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

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

关于Javascript继承范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5148459/

相关文章:

javascript - Greasemonkey 脚本和函数作用域

javascript - 基于使用 ng-bind-html 添加的字段禁用提交按钮

javascript - Mootools 等待 Fx.Morph 启动

Javascript OOP继承创建GLOBAL对象

javascript - 向 JavaScript 原型(prototype)添加多个方法?

javascript - 通过 ID 获取 CSS 文件以操作属性

PHP 面向对象 : business logic layer - DB layer

c++ - 如果您使用多个 is-a 继承,您是否不想使用相互基类的虚拟继承?

javascript - Array.isArray() 方法如何检查数组?

javascript - 动态附加函数以授予对私有(private)变量的访问权限