我正在尝试使用“伪古典继承”风格来了解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");
}
}
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%的代码是重复的,所以我创建了一个父对象和三个子对象。子对象具有使用和操作父级私有数据的方法。我实现这一点的唯一方法是将所有变量公开,我不喜欢。同样,我熟悉Java,所以我可能会努力让JS像Java一样工作。
答案 0 :(得分:3)
你在这里解决了面向对象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