改变定义方式的原型奇怪的结果

时间:2012-10-16 10:31:46

标签: javascript prototype

当尝试测试原型功能时,我得到了这个奇怪的结果: 这是我的第一次测试:

<script>
function Hello() {
}
var a = new Hello();

Hello.prototype.name = "Fred";
alert(a.name);
</script>

而且,这是第二个:

<script>
function Hello() {
}
var a = new Hello();

Hello.prototype = {
        name : "Fred",
}
alert(a.name);
</script>

我无法理解为什么第一个会返回“Fred”的警报而第二个是“未定义”,尽管这些意思相同? 你能帮帮我吗? 谢谢。

3 个答案:

答案 0 :(得分:2)

当您在JavaScript中定义函数时,解释器会在函数上创建一个特殊的prototype属性,该属性指向一个对象,以防您将该函数用作构造函数。使用构造函数创建新对象时,[[Prototype]]内部属性指向此对象。

当您使用新属性替换prototype属性时,您将替换该引用,如果在实例化对象后执行此操作,则会发现{{1}对象似乎是陈旧的(该对象的prototype指向[[Prototype]]指向的原始对象。

解决方案

仅直接在prototype属性上分配新属性。

prototype

使用 extend 类型函数使用新对象扩展现有var constructor = function() { }; constructor.prototype.someMethod = function() { }; 属性(在本例中,我使用了Underscore的extend()函数)。

prototype

确保在构造函数之后,分配var constructor = function() { }; _.extend(constructor.prototype, { someMethod: function() { } }); 属性是程序的下一步(通常不推荐)。

prototype

答案 1 :(得分:1)

你的订购搞砸了。您需要使用new运算符将对象分配给原型

function Hello() {
}

Hello.prototype = {
        name : "Fred",
}

var a = new Hello();
alert(a.name);​

Demo.

答案 2 :(得分:0)

这两个代码片段实际上并不相同。

在第一个脚本中,您只覆盖Hello.prototype.name,而在第二个脚本中,您覆盖Hello.prototype的全部内容。