2012-01-18 144 views
0

这是我的第一篇文章!我有一个关于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撰写的“Object Oriented Javascript”。这是一本很棒的书。

任何人都可以给我一个很好的详细解释,如何孩子的原型对象没有完全覆盖或取代,但它只是增强?

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

这真的会帮助谢谢!

+0

你'extend2'不工作作为斯托扬人。他遍历父母**原型**并将所有属性复制(原文)到孩子**原型**。当你迭代父母原型时,你尝试访问和复制对象本身的属性,而不是它们的原型。 – bennedich 2012-01-18 02:25:25

+0

我的错误bennedich,我重新编辑我的代码。 – user1120327 2012-01-18 02:42:53

回答

0

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

至于儿童的原型未被替换的事实,那是因为样机在java中仅仅是另一个对象,这样一个原型可能看起来像:

{ 
    someField: 5 
} 

这将表明该对象的实例将与场初始化称为someField其值为5。通过上面的代码,对象中的每个条目都被复制到子原型,但没有任何内容被删除。因此,如果孩子原型的样子:

{ 
    someField: 10 
    someOtherField: 3 
} 

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

{ 
    someField: 5 
    someOtherField: 3 
}