1 回答
TA贡献1830条经验 获得超9个赞
由于Greetr
构造函数调用Greetr.init
构造函数,并通过显式返回对象来覆盖其返回值,因此它们之间没有区别。
这两段代码创建完全相同的对象结构并以相同的方式工作,但有一点不同:第二段代码保持Greetr.prototype
其初始状态。
然而,最有可能的是,原始代码对同一个对象进行了创建Greetr.prototype
,Greetr.init.prototype
因为这样就可以在不输入 的情况下访问和/或扩展它.init
,这更具语义性:您打算更改由 所创建的对象的原型Greetr
,其原型通常是Greetr.prototype
。另外,在第一个代码中,instanceof
将把由Greetr
和创建的对象视为Greetr.init
的实例Greetr
。所以:
(function(global, $) {
var Greetr = function(firstName, lastName, language) {
return new Greetr.init(firstName, lastName, language);
}
Greetr.prototype = {
fullName: function() {
return this.firstName + ' ' + this.lastName;
}
};
Greetr.init = function(firstName, lastName, language) {
var self = this;
self.firstName = firstName || '';
self.lastName = lastName || '';
self.language = language || 'en';
}
Greetr.init.prototype = Greetr.prototype;
global.Greetr = global.G$ = Greetr;
}(window, jQuery));
var g = G$('John', 'Doe');
console.log(g instanceof G$);
<html>
<head>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</body>
</html>
(function(global, $) {
var Greetr = function(firstName, lastName, language) {
return new Greetr.init(firstName, lastName, language);
}
Greetr.init = function(firstName, lastName, language) {
var self = this;
self.firstName = firstName || '';
self.lastName = lastName || '';
self.language = language || 'en';
}
Greetr.init.prototype = {
fullName: function() {
return this.firstName + ' ' + this.lastName;
}
};
global.Greetr = global.G$ = Greetr;
}(window, jQuery));
var g = G$('John', 'Doe');
console.log(g instanceof G$);
<html>
<head>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</body>
</html>
添加回答
举报