Javascript 设置函数构造函数原型(示例中)
我试图理解“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={ 全
Greeter.init.prototype=Greeter.prototype用于使Greeter.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实例)代码>
,它已经过时了。