我需要从另一个人那里固有一个班级。
父有私有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)
答案 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。