上篇主要說明了js function模擬類別的用法
細節有幾個部分可以說說
1. 宣告了function可以直接呼叫,也可以加上new當作建構式來用
差別是this與prototype設定 (prototype介紹繼承再介紹吧)
2. 如果裡面沒有回傳值,在當作建構式使用時,會回傳this物件
如果裡面回傳的是Primitive Data Type時,預設也會回傳this物件
如果裡面有回傳物件,就是直接回傳新的物件
3. 當我們宣告var fn = function(){};的時候其實也是在宣告一個attribute fn
只是它是個function object
4. 當在function中存取一個attribute
而且如果沒有在function裡面宣告的話
會往"外面"尋找相同名字的attribute
5. private attribute與method是利用第3,4來完成的
建立不能直接存取到的method與attribute
(硬是要應該還是可以啦 = =)
6. 第4點說的"外面"指的是外面的scope (JavaScript是以function來區分scope)
所以會往這個function的外面的function來尋找
而不會找本身所在的物件所擁有的function(不會從this先找起)
ex.
// 以下範例使用getCoord()
// 預設找外面的function的getCoord而不是本身物件的getCoord
var Person = function(_name, _age){
var x = 10,
y = 15;
var getCoord = function(){
return "("+x+","+y+")";
};
this.name = _name,
this.age = _age,
this.moveX = function(step){
x += step;
};
this.moveY = function(step){
y += step;
};
this.getCoord = function(){
return "["+x+","+y+"]";
};
this.hi = function(){
return this.name+"在"+getCoord()+":hi!";
};
};
var p = new Person("丹丹", 18);
p.hi(); // 丹丹在(10, 15): hi!
Q. 範例的hi() 如果把this.name 改成name會如何?
A. 因為在hi()裡面找不到name所以會到Person()裡面找
但是Person()也找不到就會找global的name
應該會出現name is not defined的錯誤訊息
but 在chrome中測試,window裡面有個神奇的name屬性
所以.... 其實也不會出錯啦~~
ps. 用node js測試就出現錯誤訊息啦!!!
ReferenceError: name is not defined
at hi (repl:20:8)
at repl:1:3
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
2014年5月30日 星期五
[js] JavaScript的"類別"用法
一般寫Java或者是其他物件導向的程式語言時
我們使用物件中的method或是attribute如果在本身物件中找不到
就會往自己的繼承來的method或者是attribute尋找
JavaScript裡面並沒有直接繼承這樣的語法,畢竟沒有類別咩~~
JavaScript首先透過function提供類似建構式的用法,更可以用來模擬類別
用法如下,介紹留待下篇講解~
var Person = function(){};
var p = new Person();
var Person = function(_name, _age){
this.name = _name;
this.age = _age;
};
var p = new Person("丹丹", 18);
console.log(p.name +"("+p.age+")");
var Person = function(_name, _age){
this.name = _name;
this.age = _age;
this.hi = function(){
console.log(this.name+":hi!");
};
};
var p = new Person("丹丹", 18);
console.log(p.name +"("+p.age+")");
p.hi();
var Person = function(_name, _age){
var x = 10,
y = 15;
var getCoord = function(){
return "("+x+","+y+")";
};
this.name = _name;
this.age = _age;
this.moveX = function(step){
x += step;
};
this.moveY = function(step){
y += step;
};
this.hi = function(){
return this.name+"在"+getCoord()+":hi!";
};
};
var p = new Person("丹丹", 18);
p.hi(); // 丹丹在(10, 15): hi!
p.moveX(5);
p.hi(); // 丹丹在(15, 15): hi!
我們使用物件中的method或是attribute如果在本身物件中找不到
就會往自己的繼承來的method或者是attribute尋找
JavaScript裡面並沒有直接繼承這樣的語法,畢竟沒有類別咩~~
JavaScript首先透過function提供類似建構式的用法,更可以用來模擬類別
用法如下,介紹留待下篇講解~
建構式用法
var Person = function(){};
var p = new Person();
增加attribute
var Person = function(_name, _age){
this.name = _name;
this.age = _age;
};
var p = new Person("丹丹", 18);
console.log(p.name +"("+p.age+")");
增加method
var Person = function(_name, _age){
this.name = _name;
this.age = _age;
this.hi = function(){
console.log(this.name+":hi!");
};
};
var p = new Person("丹丹", 18);
console.log(p.name +"("+p.age+")");
p.hi();
增加private attribute跟method
var Person = function(_name, _age){
var x = 10,
y = 15;
var getCoord = function(){
return "("+x+","+y+")";
};
this.name = _name;
this.age = _age;
this.moveX = function(step){
x += step;
};
this.moveY = function(step){
y += step;
};
this.hi = function(){
return this.name+"在"+getCoord()+":hi!";
};
};
var p = new Person("丹丹", 18);
p.hi(); // 丹丹在(10, 15): hi!
p.moveX(5);
p.hi(); // 丹丹在(15, 15): hi!
2014年5月25日 星期日
[js] JavaScript裡面只有物件沒有類別。
一般來說想到寫OO,大概會先想寫個類別然後new一下
很開心的就可以來宣稱[這就是OO啦]
OOP的特性印象中是封裝、多型、繼承
老實說越看越感覺"說得很明確,感覺很模糊"
(好吧,討論OO下去這篇根本就歪掉了)
總之,OO其實只是我們一種組織邏輯的方式
依照職責分工、允許有各自不同的細節、實作可以重複利用等等
特性的部分應該只是歸納後的重點
分類管理做得好,大而不肥,粗中帶細,才是真正的OO啦!!!
---
與一般OO程式語言先寫Class(權責分類)再建立Object(程式重用)不同
JavaScript則是建立Object(先有能用的程式)... 然後"結束"...
例如:
var person = {
name: "小明",
age: "18",
hi: function(){
console.log(name+"是個"+age+"歲的年輕人");
}
};
person.hi();
也就是JavaScript的特性允許我們馬上開始建立能用的程式!!
其實幾行甚至一兩百行的小程式這樣寫也不是什麼大問題
問題還是出在管理上,這樣子的程式越來越多,一天有個幾百行,一個月...一年...
零散沒有組織的邏輯,只會搞死後來維護的人。
根據這樣的基礎,我們應該思考衍生出來的後續問題
該怎麼合理有效的組織js物件
如何建立物件?
如何分類物件?
如何讓很多不同的物件可以活在同一個頁面上,又彼此獨立不會相互影響?
如何讓物件是一個獨立的個體,又足夠開放給外部功能做存取?
js很有意思的!!!
回過頭來,雖然js允許我們利用不OO的方式組織程式
但是透過寫物件與一些語法的性質,我們一樣可以建立有OO感的js程式 <3
也就是說... 程式寫不好大部份還是人的問題啦...
很開心的就可以來宣稱[這就是OO啦]
OOP的特性印象中是封裝、多型、繼承
老實說越看越感覺"說得很明確,感覺很模糊"
(好吧,討論OO下去這篇根本就歪掉了)
總之,OO其實只是我們一種組織邏輯的方式
依照職責分工、允許有各自不同的細節、實作可以重複利用等等
特性的部分應該只是歸納後的重點
分類管理做得好,大而不肥,粗中帶細,才是真正的OO啦!!!
---
與一般OO程式語言先寫Class(權責分類)再建立Object(程式重用)不同
JavaScript則是建立Object(先有能用的程式)... 然後"結束"...
例如:
var person = {
name: "小明",
age: "18",
hi: function(){
console.log(name+"是個"+age+"歲的年輕人");
}
};
person.hi();
也就是JavaScript的特性允許我們馬上開始建立能用的程式!!
其實幾行甚至一兩百行的小程式這樣寫也不是什麼大問題
問題還是出在管理上,這樣子的程式越來越多,一天有個幾百行,一個月...一年...
零散沒有組織的邏輯,只會搞死後來維護的人。
根據這樣的基礎,我們應該思考衍生出來的後續問題
該怎麼合理有效的組織js物件
如何建立物件?
如何分類物件?
如何讓很多不同的物件可以活在同一個頁面上,又彼此獨立不會相互影響?
如何讓物件是一個獨立的個體,又足夠開放給外部功能做存取?
js很有意思的!!!
回過頭來,雖然js允許我們利用不OO的方式組織程式
但是透過寫物件與一些語法的性質,我們一樣可以建立有OO感的js程式 <3
也就是說... 程式寫不好大部份還是人的問題啦...
[js] JS記錄文系列 ~start~
標題的小小start,代表著這次弱弱的決心
主要是JavaScript的一些觀念,平常實在不常用,但是就還是會用到 @"@
只好來做整理!!
目標並不是要做細節的介紹,而是整理目前覺得重要的重點,跟實際的範例
範例的部分會使用jsfiddle來幫忙
基本的框架會有jQuery, bootstrap等,主要以本人閱讀容易為準。
隨時會調整的大綱如下:
主要是JavaScript的一些觀念,平常實在不常用,但是就還是會用到 @"@
只好來做整理!!
目標並不是要做細節的介紹,而是整理目前覺得重要的重點,跟實際的範例
範例的部分會使用jsfiddle來幫忙
基本的框架會有jQuery, bootstrap等,主要以本人閱讀容易為準。
隨時會調整的大綱如下:
- js裡面只有object,沒有class
- js的物件建立模式 - 1, 2, 3, .... (這應該需要系列文,主要從javascript pattern中整理)
- js程式的模組化模式
- function scope
- this
- prototype
2014年5月24日 星期六
[css] Selector & Combinator
順手記錄下~
原來一直弄錯以為combinator也應該叫做selector但是其實不是 XDD
這種含有關係的selector應該叫做combinator(組合器?)
selector
element
就是html tag的選擇器
例如:html, input, p, ...
#id
如果我們有指定id給某個element, 就是選取有著此id的element
例如:#datalist, #menu
.class
如果我們有指定class給某個element, 就是選取有著此class的element
id與class差別是,id在整個頁面是要唯一的,但是class不需要
(這應該可以從名字就看得出來了,但是硬是不這樣用...誰拿你有辦法?)
在bootstrap裡面就定義了很多class給我們用.btn, .table等等
Combinator
看到descendant 跟child都要介紹,應該很明顯有英文單字詞彙不夠的感覺。
descendant: 子孫
child: 孩子, 小孩
sibling: 兄弟
明顯是想混淆我們啊!!!!!! 這樣技術會比較值錢嗎?
descendant selector
ex. div p:選擇div裡面所有的p
child selector
ex. div > p:選擇剛好在div下一層的p
general sibling selector
ex. div~p:選擇div之後所有的p
adjacent sibling selector
ex. div+p:選擇剛剛好在div之後的一個p
這裡有飯粒:
http://jsfiddle.net/progden/gd2Lx/
http://jsfiddle.net/progden/Mf6zT/
2014年4月29日 星期二
SQL Server 驗證 方式設定
一般剛裝好的SQL Server是不能使用帳號密碼登入的
就算設定了使用者也是一樣
下面就來介紹一下除了設定使用者(security -> login)之外的其他設定
----
1. Server的驗證模式 調整成混合模式 (需要重啟Server)
http://technet.microsoft.com/zh-tw/library/ms143705(v=sql.90).aspx
2. SQL Server Configuration Manager的"網路組態"設定啟用TCP/IP,並且在裡面的IPALL設定Port為指定的port(default=1433)
(下面這個兩個設定都有啊,保哥果然厲害!!!)
http://blog.miniasp.com/post/2007/12/28/How-to-enable-SQL-Express-TCP-IP-connection.aspx
就算設定了使用者也是一樣
下面就來介紹一下除了設定使用者(security -> login)之外的其他設定
----
1. Server的驗證模式 調整成混合模式 (需要重啟Server)
http://technet.microsoft.com/zh-tw/library/ms143705(v=sql.90).aspx
2. SQL Server Configuration Manager的"網路組態"設定啟用TCP/IP,並且在裡面的IPALL設定Port為指定的port(default=1433)
(下面這個兩個設定都有啊,保哥果然厲害!!!)
http://blog.miniasp.com/post/2007/12/28/How-to-enable-SQL-Express-TCP-IP-connection.aspx
2014年3月7日 星期五
MySQL Create User
CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'root' with grant option
ps aux
指令介紹:
ps aux:看行程
grep:篩選
awk:格式化輸出
應用:
ps aux | grep 'httpd' | awk '{print $2}'ps aux:看行程
grep:篩選
awk:格式化輸出
應用:
kill $(ps aux | grep 'httpd' | awk '{print $2}')
2014年2月19日 星期三
Tomcat中createNewFile發生錯誤
Tomcat中createNewFile發生錯誤
<Item>
寫檔案 createNewFile() 發生exception
發現是Tomcat安裝路徑含有空白
<Solve>
可以透過移動Tomcat安裝路徑來解決
但是 直接一點的解法 應該是需要控制tomcat 或是 java中resource的存取
在研究...
<Ref>
ref: http://www.coderanch.com/t/554674/java/java/Create-file-spaces-file-path
<Item>
寫檔案 createNewFile() 發生exception
發現是Tomcat安裝路徑含有空白
<Solve>
可以透過移動Tomcat安裝路徑來解決
但是 直接一點的解法 應該是需要控制tomcat 或是 java中resource的存取
在研究...
<Ref>
ref: http://www.coderanch.com/t/554674/java/java/Create-file-spaces-file-path
2013年12月25日 星期三
增加sudo權限給使用者
情境
需求
1. root帳號
2. visudo
步驟
1. 利用root登入 或是 其他有權限的使用者
2. 輸入 visudo,會自動開啟vi,在裡面找到
root ALL=(ALL) ALL
3. 在這個區塊輸入指定的username,並設定權限如下
username ALL=(ALL) ALL
4. :wq! 存檔, 指定的user已經可以使用sudo囉!
訂閱:
文章 (Atom)