借用协调器和原型链

时间:2009-03-26 15:32:24

标签: javascript

在许多书籍和在线教程中都有关于将数据传递给超类的示例 构造函数通过借用方法模式:

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构造函数只是另一种模式来进行一种继承,所以我不能使用原型,所以所有的链超类属性都是 进入最后一个孩子班......但我不认为这是有效的。

那么,最后,如何在没有该模式的情况下将数据传递给超类?

由于

3 个答案:

答案 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的一些关键事项:

  • 一切都是对象,包括函数
  • 对象更像是Hash,它是一组键值对
  • 原型本身也是对象

回答关于“借用”原型表现的第一个问题:

通常,JavaScript类包含 [name,function object] 对的集合。当您借用父类 prototype 时,基本上将父原型对象的值复制到子类的原型对象中。

副本是引用,复制功能时,功能代码不重复,只复制引用。这类似于C语言中的函数指针。

  

因此唯一的表现就是   重复原型对象,   这需要很少的记忆。

回答关于如何以干净的方式将数据传递给父类的第二个问题:

有许多库已经内置了一些OOP样式继承。你也可以自己编译,但这不是一件容易的事。

我推荐一个名为Joose的框架。

  • 它支持类,继承,混合,特征,方法修饰符等。
  • 稳定并在生产环境中使用。
  • 优雅,并会为您节省很多关键笔划
  

使用Joose,可以覆盖父构造函数   或增强,和SUPER()或INNER()   将提供方法来访问   原始构造函数或子类   构造