当尝试测试原型功能时,我得到了这个奇怪的结果: 这是我的第一次测试:
<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”的警报而第二个是“未定义”,尽管这些意思相同? 你能帮帮我吗? 谢谢。
答案 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);
答案 2 :(得分:0)
这两个代码片段实际上并不相同。
在第一个脚本中,您只覆盖Hello.prototype.name
,而在第二个脚本中,您覆盖Hello.prototype
的全部内容。