Javascript 使用extend函数

Javascript 使用extend函数,javascript,prototype,extend,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”方法用于使用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函数作为引用进行查找


这真的很有帮助,谢谢

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

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

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

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

{
    someField: 5
    someOtherField: 3
}

你的
extend2
没有像Stoyans那样工作。他迭代父原型并将(原文如此)所有属性复制到子原型。当你迭代父原型时,你试图从/复制对象本身而不是它们的原型的属性。我的错bennedich,我重新编辑了我的代码。