Javascript 更改定义方式时的原型异常结果

Javascript 更改定义方式时的原型异常结果,javascript,prototype,Javascript,Prototype,在尝试测试原型功能时,我得到了一个奇怪的结果: 这是我的第一个测试: <script> function Hello() { } var a = new Hello(); Hello.prototype.name = "Fred"; alert(a.name); </script> 函数Hello(){ } var a=newhello(); Hello.prototype.name=“Fred”; 警报(a.名称); 还有,这是第二个: <script&g

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

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

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

函数Hello(){
}
var a=newhello();
Hello.prototype.name=“Fred”;
警报(a.名称);
还有,这是第二个:

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

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

函数Hello(){
}
var a=newhello();
Hello.prototype={
姓名:“弗雷德”,
}
警报(a.名称);
我不明白为什么第一个会返回带有“Fred”的警报,而第二个是“undefined”,尽管它们的意思是相同的? 你能帮我吗?
谢谢。

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


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

的全部内容,您的订单混乱不堪。在使用
new
操作符之前,需要将对象指定给原型:

function Hello() {
}

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

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

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

当您用一个新属性替换
prototype
属性时,您正在替换该引用,如果您在实例化一个对象之后执行此操作,您将发现
prototype
对象似乎已过时(该对象的
[[prototype]]
指向
prototype
的原始对象)

解决 仅在
prototype
属性上直接指定新属性

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

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


哇,你是我的英雄亚历克斯。极其简单,超级容易理解。非常感谢!
var constructor = function() { };
_.extend(constructor.prototype, { someMethod: function() { } });
var constructor = function() { };
constructor.prototype = { someMethod: function() { } };