Javascript 设置函数构造函数原型(示例中)

Javascript 设置函数构造函数原型(示例中),javascript,Javascript,我试图理解“JavaScript:理解奇怪的部分”课程中的一个例子。有一行代码Greeter.init.prototype=Greeter.prototype 将考虑由 Greetr < /代码>和 Greetr .init < /C> >作为 Greetr < /COD>的实例。因此: (函数(全局,$){ var Greetr=函数(名字、姓氏、语言){ 返回新的Greetr.init(firstName、lastName、language); } Greetr.prototype={ 全

我试图理解“JavaScript:理解奇怪的部分”课程中的一个例子。有一行代码
Greeter.init.prototype=Greeter.prototypeGreeter.prototype
成为从
Greeter.init
函数构造函数创建的所有对象的原型,因此我们可以在
Greeter.prototype
中设置方法

但是我不明白为什么不直接在
Greeter.init.prototype
中设置方法。它也会起同样的作用。行
Greeter.init.prototype=Greeter.prototype看起来像冗余代码。原始方法的优势是什么

原始代码:

(函数(全局,$){
var Greetr=函数(名字、姓氏、语言){
返回新的Greetr.init(firstName、lastName、language);
}
Greetr.prototype={
全名:函数(){
返回this.firstName+“”+this.lastName;
}
};
Greetr.init=函数(名字、姓氏、语言){
var self=这个;
self.firstName=firstName | |“”;
self.lastName=lastName | |“”;
self.language=语言| | en |;
}
Greetr.init.prototype=Greetr.prototype;
global.Greetr=global.G$=Greetr;
}(窗口,jQuery));
var g=g$('John','Doe');
控制台日志(g);
log(g.fullName())

由于
Greetr
构造函数调用
Greetr.init
构造函数,并通过显式返回对象覆盖其返回值,因此它们之间没有区别

这两个代码创建的对象结构和工作方式完全相同,但有一个区别:第二个代码将
Greetr.prototype
保留在初始状态

但是,最有可能的是,原始代码将
Greetr.prototype
Greetr.init.prototype
创建到同一个对象,因为这样就可以访问和/或扩展它,而无需键入
.init
,这更具语义:您打算更改由
Greetr
创建的对象的原型,其原型通常是
Greetr.prototype
。此外,在第一个代码中,<代码>实例> <代码>将考虑由<代码> Greetr < /代码>和<代码> Greetr .init < /C> >作为<代码> Greetr < /COD>的实例。因此:

(函数(全局,$){
var Greetr=函数(名字、姓氏、语言){
返回新的Greetr.init(firstName、lastName、language);
}
Greetr.prototype={
全名:函数(){
返回this.firstName+“”+this.lastName;
}
};
Greetr.init=函数(名字、姓氏、语言){
var self=这个;
self.firstName=firstName | |“”;
self.lastName=lastName | |“”;
self.language=语言| | en |;
}
Greetr.init.prototype=Greetr.prototype;
global.Greetr=global.G$=Greetr;
}(窗口,jQuery));
var g=g$('John','Doe');
log(g$的g实例)

,它已经过时了。