2011-02-28 151 views
2

我试图让我的头绕着使用“伪古典继承”风格的JS继承。我做了很多谷歌搜索,并阅读了经典文章。我熟悉Java的类结构,并试图理解JS的原型风格。我正在寻找香草JS,因为我想先了解基础知识。JavaScript继承范围问题

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

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

一个构造函数的范围内定义的变量和函数可以访问的唯一方法是,如果他们是通过关闭访问 – 2011-02-28 23:08:05

+0

你能提供一个我如何访问“privateValue”的例子吗?它不需要在构造函数中。我可以设置一个包含我需要的私有数据的初始化方法。基本上我有许多方法需要能够共享的内部数据。 – David 2011-02-28 23:12:31

+0

抱歉的错误答案〜 – Shad 2011-02-28 23:17:51

回答

3

您正在解决一些有趣的面向对象JavaScript的问题。

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

2)但是在构造函数中定义函数的好处是你可以使用“private”方法/属性。在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