2012-10-17 165 views
1

当试图单独执行以下两个代码块: 第一招:JavaScript构造函数

function Hallo() { 

} 
var some_obj = { 
    name: "Fred", 
    age: 23, 
} 
Hallo.prototype = some_obj; 
var obj = new Hallo(); 
obj.constructor; 

,第二个:

function Hallo() { 

    } 
    Hallo.prototype.name = 'Khanh'; 
    Hallo.prototype.age = 23; 
    var obj = new Hallo(); 
    obj.constructor; 

我得到的结果在Firebug的控制台“对象{}“,第二个是”Hallo()“。 虽然第二个很容易理解,但第一个很奇怪。因为我知道第一个obj Object的构造函数仍然是相同的(即Hallo()函数)。 但是我得到了Object()函数的结果。 我真的不明白为什么。你能帮我吗? 谢谢!

+0

你覆盖在第一个例子整个'prototype',但在第二个你只增加两个新的属性。 – Blender

+0

是的,我知道,但构造函数仍然是一样的,不是吗?我关心构造函数。 –

+1

当您覆盖*整个*原型时​​,'构造函数'被您的对象的构造函数覆盖。 – Blender

回答

2

的原因是:

当你这样做var obj = new Hallo();,然后

console.log(obj.constructor === Hallo.prototype.constructor); // true 

在第一个示例中,您为Hallo.prototype分配了一个新对象,该对象的constructor为函数Objectfunction Object(){...})。

在第二个例子中,Hallo.prototype.constructor仍然function Hallo() {...}

+0

感谢xdazz,我测试过你用萤火虫回答。是的,它完全按照你的说法回报。所以,如果我这样做:var obj = new Hallo(),obj的构造函数不是真正的Hallo()函数,而是始终是Hallo.prototype构造函数。然而,我读了一本叫做Object Oriented Javascript的书,它说:如果我这样做:var obj = new Hallo(),那么obj Object就是由Hallo()构造函数创建的。所以它与你的答案不同。你能解释一下这个混乱吗? –

1

原型将得到指向默认构造函数的引用,诠释您覆盖原型some_obj第一功能,同时构造引用更改为some_obj的构造参考--Object的构造函数对象()