-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGreet.js
More file actions
154 lines (125 loc) · 3.99 KB
/
Greet.js
File metadata and controls
154 lines (125 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Exposing code in a safe manner
(function(global,$)
{
// 'new' an object is created without using the keyword
var Greet = function(firstname, lastname, language) {
return new Greet.init(firstname, lastname, language);
}
// All the varibales are hidden within the scope of the IIFE and never directly accessible
var langs = ['en', 'am']
// informal greetings
var greetings =
{
en: 'Hi There ',
am: 'Endate Nek '
};
// formal greetings
var formalGreeting = {
en: "Greetings",
am: "Selam Leant Yehune"
};
// logger messages
var loged = {
en: "Loggin In",
am: "Tedergwale"
};
// prototype holds methods (to save memory space)
Greet.prototype = {
// 'this' refers to the calling object at execution time
fullName: function()
{
return this.firstname + ' ' + this.lastname;
},
// check that is a valid language
// references the externally inaccessible 'supportedLangs' within the closure
validateLan : function()
{
if(langs.indexOf(this.language) === -1)
{
throw "Invalid Language";
}
},
// retrieve messages from object by referring to properties using [] syntax
informalGreeting: function()
{
return greetings[this.language] + ' ' + this.firstname + '!';
},
formalGreeting: function()
{
return formalGreeting[this.language] + ', ' + this.fullName();
},
// chainable methods return their own containing object
greet: function(formal)
{
var message;
// if undefined or null it will be coerced to 'false'
if(formal)
{
message = this.formalGreeting();
}
else{
message = this.informalGreeting();
}
if(console)
{
console.log(message);
}
// 'this' refers to the calling object at execution time
// makes the method chainable
return this;
},
log:function()
{
if(console)
{
console.log(loged[this.language] + ':' + this.fullName());
}
// make chainable
return this;
},
setLanguage: function(lang)
{
// set the language
this.language = lang;
// validate
this.validateLan();
// make chainable
return this;
},
HTMLGreeting: function(selector, formal)
{
if(!$)
{
throw "Jquery not loaded ...";
}
if(!selector)
{
throw "Missing Jquery Selector...";
}
var msg;
if(formal)
{
msg = this.formalGreeting();
}
else{
msg = this.informalGreeting();
}
$(selector).html(msg)
return this;
},
};
// the actual object is created here, allowing us to 'new' an object without calling 'new'
Greet.init = function(firstname, lastname, language)
{
var self = this;
// Making a default value
self.firstname = firstname || '';
self.lastname = lastname || '';
self.language = language || 'en';
}
// trick borrowed from jQuery so we don't have to use the 'new' keyword
Greet.init.prototype = Greet.prototype;
// attach our Greetr to the global object, and provide a shorthand '$G' for ease our poor fingers
global.Greet = global.G$ = Greet;
}
)(window,$);