使用扩展功能

时间:2012-01-18 02:06:17

标签: javascript prototype extend

这是我的第一篇文章!关于javascript中的继承,我有一个简单的问题。

当然'extend2'方法用于使用for-in循环从父对象继承子对象。

var extend2 = function (child, parent) {
    var c = child.prototype;
    var p = parent.prototype;
    for (var i in p) {
        c[i] = p[i];
    }
}

我目前正在阅读Stoyan Stefanov撰写的“面向对象的Javascript”。这是一本很棒的书。

有人能给我一个很好的详细解释,说明孩子的原型对象是如何被完全覆盖或替换的,但它只是增加了吗?

当对象继承时,它们如何复制(原始数据类型)而不是通过使用extend2函数被查找为引用?

这真的有助于感谢!

1 个答案:

答案 0 :(得分:0)

javascript中的原始数据类型通过值传递,而不是通过引用传递。因此,当您复制一个值时,它实际上是复制它,而不是指它。 传统上这是因为原语在内存中以这种方式字面编码(因此原始int 7将在内存中编码为0x7。但是,当处理对象时,它们被编码为指向实际内存位置的指针。因此,复制值时,它只是引用指针的副本,而不是该指针引用的对象。

至于孩子的原型没有被替换的事实,那是因为java中的原型只是另一个对象。所以原型可能看起来像:

{
    someField: 5
}

这表示对象的实例将使用名为someField的字段初始化,其值为5。使用上面的代码,对象中的每个条目都被复制到子原型,但没有删除任何内容。因此,如果儿童原型看起来像:

{
    someField: 10
    someOtherField: 3
}

然后执行上面的extend2命令将覆盖someField,但不会覆盖someOtherField,因此生成的原型将是:

{
    someField: 5
    someOtherField: 3
}