当然'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函数被查找为引用?
这真的有助于感谢!
答案 0 :(得分:0)
javascript中的原始数据类型通过值传递,而不是通过引用传递。因此,当您复制一个值时,它实际上是复制它,而不是指它。 传统上这是因为原语在内存中以这种方式字面编码(因此原始int 7将在内存中编码为0x7。但是,当处理对象时,它们被编码为指向实际内存位置的指针。因此,复制值时,它只是引用指针的副本,而不是该指针引用的对象。
至于孩子的原型没有被替换的事实,那是因为java中的原型只是另一个对象。所以原型可能看起来像:
{
someField: 5
}
这表示对象的实例将使用名为someField
的字段初始化,其值为5
。使用上面的代码,对象中的每个条目都被复制到子原型,但没有删除任何内容。因此,如果儿童原型看起来像:
{
someField: 10
someOtherField: 3
}
然后执行上面的extend2命令将覆盖someField,但不会覆盖someOtherField,因此生成的原型将是:
{
someField: 5
someOtherField: 3
}