在许多书籍和在线教程中都有关于将数据传递给超类的示例 构造函数通过借用方法模式:
var Parent = function(name)
{
this.name = name;
this.my_parent = "parent_property";
this.go = function()
{
alert("GO")
}
}
var Child = function(name)
{
this.name = name;
this.my_child = "child_property";
Parent.call(this);
alert(this.hasOwnProperty("go")) // HERE TRUE!!!
}
var ChildChild = function(name)
{
this.name = name;
this.su = function(){}
}
// PSEUDO CLASSICAL ECMA STANDARD
Child.prototype = new Parent("PARENT");
ChildChild.prototype = new Child("CHILD");
var c = new ChildChild("CHILDCHILD");
现在我的问题是:这是对的吗?在那种模式中超类的属性 复制到这个,但在OOP系统中,我认为那些属性必须在其中 超一流的。现在BORROWING构造函数只是另一种模式来进行一种继承,所以我不能使用原型,所以所有的链超类属性都是 进入最后一个孩子班......但我不认为这是有效的。
那么,最后,如何在没有该模式的情况下将数据传递给超类?
由于
答案 0 :(得分:1)
通过调用.call(),你不会继承传统意义上的单词,而是告诉Child将Parents原型应用于自身,因此Child.prototype克服了Parent的属性和方法。这在性能方面没有任何问题,但出于效率原因放弃原型并不是一个正当理由。
如果我可以说实话,我认为在javascript上强制执行OO范例是javascript开发人员可以犯的最大错误。就像必须学会处理函数式编程中的不变性一样,试图让javascript表现得像经典的OO只会在长期内对你起作用。
它没有回答你的问题,但是有很多不同的方法可以应用a super functionality to javascript,但我没有推荐,因为没有确定的版本没有在某个地方带来下行。
答案 1 :(得分:1)
JavaScript对构建继承层次没有固有的支持。做类型扩展的JavaScript方法是将“父类”的属性添加到“子类”,即
function Parent(foo) {
this.foo = foo;
}
Parent.prototype.sharedFoo = 'sharedFoo';
function Child(foo, bar) {
// call the parent constructor
Parent.call(this, foo);
this.bar = bar;
}
Child.prototype.sharedBar = 'sharedBar';
// copy the properties of the parent class
for(var prop in Parent.prototype) {
if(Parent.prototype.hasOwnProperty(prop))
Child.prototype[prop] = Parent.prototype[prop];
}
也很容易添加真正的原型继承,例如like this。
通过使用clone()
函数,现在可以让'子类'的原型对象继承“基类”的原型对象:
function Parent(foo) {
this.foo = foo;
}
Parent.prototype.sharedFoo = 'sharedFoo';
function Child(foo, bar) {
// call the parent constructor
Parent.call(this, foo);
this.bar = bar;
}
// inherit from the parent class
Child.prototype = clone(Parent.prototype);
Child.prototype.sharedBar = 'sharedBar';
答案 2 :(得分:1)
JavaScript是一种基于原型的,功能语言,它假装是Java的堂兄。
以下是JavasSript的一些关键事项:
回答关于“借用”原型表现的第一个问题:
通常,JavaScript类包含 [name,function object] 对的集合。当您借用父类的 prototype 时,基本上将父原型对象的值复制到子类的原型对象中。
副本是引用,复制功能时,功能代码不重复,只复制引用。这类似于C语言中的函数指针。
因此唯一的表现就是 重复原型对象, 这需要很少的记忆。
回答关于如何以干净的方式将数据传递给父类的第二个问题:
有许多库已经内置了一些OOP样式继承。你也可以自己编译,但这不是一件容易的事。
我推荐一个名为Joose的框架。
使用Joose,可以覆盖父构造函数 或增强,和SUPER()或INNER() 将提供方法来访问 原始构造函数或子类 构造