javascript继承?私人变量和方法也是如此

时间:2010-04-29 23:23:26

标签: javascript

我需要从另一个人那里固有一个班级。

父有私有var“_data”和私有方法“_test”和公共方法“添加” 现在孩子有一个公共方法“add”,它使用父“_test”中的私有方法和私有var“_data”。

我该怎么做?

var Parent = function(){
    var _data = {};
    var _test = function(){alert('test')};
    this.add = function(){alert('add from parent')}
}

var Child = function(){
    this.add = function(){// here uses the _data and _test from the Parent class
        alert('add from child')
    }
}

// something to inherent Child from Parent
// instance Child and use the add method

我认为我会错过原型概念(Javascript inheritance

3 个答案:

答案 0 :(得分:1)

通常,在JavaScript中进行继承的方式是将Child类的prototype属性分配给Parent对象的实例。因此,您需要为Child定义构造函数:

function Child() { /* initialization yadda yadda */ }

然后执行此操作:

Child.prototype = new Parent();

或多或少等同于其他语言中的Class Child extends Parent - 然后,Child具有方法,成员和通过闭包,父对象的私有成员。

这里有几个棘手的问题。其中之一是在构造函数中完成初始化。显式地调用Child构造函数中的Parent构造函数( function Child() { Parent(); })似乎是最明显的方法,但是由于this处理并从初始化返回的方式(在函数{{1内部)中存在问题什么是Parent?)。您可以使用this apply方法解决此问题(每个函数都可以访问):

Function

(有关申请的更多信息,请参阅http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Function/apply

但我通常这样做的方法是将类的所有初始化分解为单独的“init”函数,该函数将替换构造函数。

function Child() { Parent.apply(this,arguments); //initialization unique to Child goes here }

function Parent() { this.init(); }

这样,这只是继承了其他一切......或者我可以写一个新的,如果我愿意,可以调用旧的:

Parent.prototype.init = function () { /* initialization yadda yadda */ }

另一个棘手的问题是访问Child.prototype.init = function () { Parent.prototype.init.apply(this,arguments); /* insert stuff unique to child constructor here */ }的私人成员。除了Parent的方法之外,你真的不能这样做。它们是真正的私有,而不是“受保护”,“子类”除了通过它们继承的方法之外无法看到它们。有一些写作的方法,但这可能是另一个Q / A,最简单的方法是确保你设计好Parent

答案 1 :(得分:0)

有些库可以使用类似OOP的功能扩展JavaScript。也许你在John Resigs Blog Entry上找到关于JS继承的东西(通过base2和Prototype)。

答案 2 :(得分:0)

一个简单的继承:

function createChild(){
    Child.prototype=new Parent()
    return new Child()
}

通过这种方式,您可以为每个Child重新初始化Parent。