1

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

<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”的警报,而第二个是“未定义”,尽管它们的意思是一样的?你能帮我吗?谢谢你。

4

3 回答 3

2

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

当你prototype用一个新的属性替换属性时,你就是在替换那个引用,如果你在实例化一个对象之后这样做,你会发现这个prototype对象看起来是陈旧的(那个对象指向的[[Prototype]]是指向的原始对象prototype)。

解决方案

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

var constructor = function() { };
constructor.prototype.someMethod = function() { };

使用扩展类型函数用新对象扩展现有prototype属性(在本例中,我使用了 Underscore 的extend()函数)。

var constructor = function() { };
_.extend(constructor.prototype, { someMethod: function() { } });

确保在构造函数之后,分配prototype属性是程序中的下一步(通常不推荐)。

var constructor = function() { };
constructor.prototype = { someMethod: function() { } };
于 2012-10-16T10:34:19.193 回答
1

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

function Hello() {
}

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

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

演示。

于 2012-10-16T10:34:19.393 回答
0

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

在第一个脚本中您只覆盖Hello.prototype.name,而在第二个脚本中您覆盖Hello.prototype.

于 2012-10-16T10:34:05.170 回答