1.2.8.4.屬性與可鏈結方法
利用閉包, 可以建立一個供IIFE內部使用但不會被其他開發者取用而影響到原始碼本身
原型物件中的this會指向物件本身
(function (global, $) {
//不需要每次都使用new
var Greetr = function (firstname, lastname, language) {
return new Greetr.init(firstname, lastname, language)
}
var supportedLangs = ['en', 'es'];
var greetings = {
en: 'Hello',
es: 'Hola'
};
var formalGreetings = {
en: 'Greetings',
es: 'Saludos'
};
var logMessage = {
en: 'Logged in',
es: 'dfdsfdsf'
};
//* 原型物件中的this會指向物件本身
Greetr.prototype = {
fullName: function(){
return this.firstname + ' ' + this.lastname;
},
validate: function(){
if (supportedLangs.indexof(this.language) === -1) {
throw "Invalid language";
}
},
greeting: function() {
return greetings[this.language] + this.fistname + '!';
},
formalGreeting: function() {
return formalGreetings[this.language] + this.fistname + '!';
},
//可鍊結的方法
greet: function(formal) {
var msg;
if (formal) {
msg = this.formalGreeting();
} else {
msg = this.greeting();
}
if (console) {
console.log(msg);
}
return this
},
log: function() {
if (console) {
console.log(logMessage[this.language]);
}
return this;
},
setLang: function(lang) {
this.language = lang;
this.validate();
}
};
//用new建構子呼叫時, this會指向新建立的空物件
Greetr.init = function (firstname, lastname, language) {
var self = this;
self.firstname = firstname || '';
self.lartname = lastname || '';
self.language = language || 'en';
}
//由Greetr.init所建立的物件應該指向Greetr.prototype作為原型鍊
Greetr.init.prototype = Greetr.prototype;
//IIFE外面的Greetr(別名G$)會指向Greetr
global.Greetr = global.G$ = Greetr;
}(window, jQuery));
使用
var g = G$('John', 'Doe');
g.greet().greet(true);
Last updated
Was this helpful?