2019/0618/RWD在職班_(Javascript_object-oriented programming)
26JS_OOP
object-oriented programming
#Object
Typescript 定義class的script
Javascript 不能自己定義 class
只有classless
利用function 去定義 class
##Javascript自定義物件
把function 當成建構子看就可以
不寫class 直接寫建構子
//鑄造物件 實現化
var Jack = new namCard();
Jack.phone.homephone= “07-8210171”;
Jack.email= “jack@wda.gov.tw”;
Jack.name= “Jack Lee”;
Jack.addr = “高雄市前鎮區凱旋四路105號”
document.write(“NAME”+Jack.name+”</br>”);
document.write(“Phone”+Jack.phone.homephone+”</br>”);
document.write(“Phone”+Jack.phone.cellphone+”</br>”);
document.write(“Email”+Jack.email+”</br>”);
document.write(“Addr”+Jack.addr+”</hr>”);
//classless物件導向
var Mary = new nameCard(“Mary Lin”,”08-8974582”,Mary@wda.gov.tw,”屏東縣恆春鎮墾丁路100號”);
Mary.phoneList.cellphone =”08777777”
document.write(“NAME”+ Mary.name+”</br>”);
document.write(“Phone”+ Mary.phone.homephone+”</br>”);
document.write(“Phone”+ Mary.phone.cellphone+”</br>”);
document.write(“Email”+ Mary.email+”</br>”);
document.write(“Addr”+ Mary.addr+”</hr>”);
##子物件 子建構函數 子類別
可以定義成三個欄位或定義成一個phone物件
定義phone 的建構子 ( 物件 )
//子類別
Function phoneList(homephone,cellphone){
This.homephone = homephone
This.cellphone = cellphone
}
一般來講在必須要繼承一個抽象類別,在自己的方法定義或overrider。
但javascript 無法。
Var John = new nameCard(“John”,”0204”,”John@www.tw”,”高雄市”)
John.phoneList.cellphone =”08977777”
//動態實例擴充Instance
John.type = “經理” ;
##新版的瀏覽器允許動態實例擴充classinstens跟pretype不一樣
「實例擴充」(Instance Extension)、「類別擴充」(Class Extension)
也可以做動態方法
##沒有class 怎麼定義方法呢?
屬性 = 物件的特徵
方法 = 物件的技能
但不是function裡面定義function
其實跟子類別很像 開頭都是 function 但是 邏輯上不同
Function printCard (){
document.write(“NAME”+ this.name+”</br>”);
document.write(“Phone”+ this.phone.homephone+”</br>”);
document.write(“Phone”+ this.phone.cellphone+”</br>”);
document.write(“Email”+ this.email+”</br>”);
document.write(“Addr”+ this.addr+”</hr>”);
}
Jack.print(); 要加括弧因為是方法不是屬性
很靈活 但架構鬆散 ?
今天有個方法 但要用內鍵方法來當我的方法 ??
##靜態方法/屬性擴充
nameCard.now = function () {
return new Date();
}
Document.write(NameCard.now())
NameCard.img =”abc.jpg”;
Document.write(NameCard.img)
較迂迴的方式實現物件導向技術
#Prototype base 原型基礎 classbase 物件導向概念?
類別 抽象化過後的 資料型態
類別與物件之間沒有太大區別
( 雖然有 new的動作 沒有類別 就是建構子 一個方法而已
物件是類別鑄造出來的實例
##如何繼承? Prototype Extension
//Prototype物件
Function circle(r,color){
This.r = r ;
This.color = color ;
This.display = showCircle;
//動詞當作名稱通常就是方法。一定會有個mether叫showCircle
}
Function showCircle(){
Document.write(this.r);
Document.write(this.color);
//類別裡面根本就沒有PI,直接把PI這個屬性用Prototype方式擺進去。
Document.write(this.PI);
}
Var C1 = new circle (2,”red”);
Var C2 = new circle (3,”green”);
// Prototype Extension ( prototype是個物件
circle.prototype.PI = 3.1415926;
// 在circle裡面新增PI且給值
利用prototype 做出來的屬性 就是直接給予這個類別的,類似繼承。
因為是寫進 circle 所以 c1 、 c2 都能呼叫
C1.display(); C2.display();
今天有個計算圓面積的方法
Function getArea() {
Var result = this.PI*this.r*this.r;
Document.write(result);
}
//擴充方法
circle.prototype.showArea = getArea;
C1.display();
C1.showArea();
舉凡用這個類別鑄造出來的物件,就能呼叫的到。
##內建物件也可以擴充…
Function reverse_string(){
document.write(“倒牌字串”
For(i=(this.length-1);i>=0;i--){
document.write(this.charAt(i));
}
}
var objMessage = new String(“高屏澎東分屬KPPTR”);
document.write(“原始字串”+objMessage);
//內建物件靜態擴充
string.prototype.reverse = reverse_string;
objMessage.reverse();
通常function 會額外一個 檔案
然後主檔就把function當作class使用
如果是臨時要加則用動態擴充。
#真的Prototype 的繼承 ( 會更趨近 class 繼承 class ( base類別
Function position(x,y,color){
This.x = x;
This.y = y ;
This.color = color ;
}
Function circle(r,color){
This.r = r;
This.info = showCircleInfo;
}
//必須要繼承position
Function showCircleInfo(){
Var result = 3.1415926 *this.r*this.r
Document.write(this.r);
Document.write(this.x);
Document.write(this.y);
Document.write(this.color);
Document.write(this.result);
}
//Prototype物件繼承 ( 實際的繼承 ( 邏輯上跟classbase一樣
Circle.prototype = new position();
//實作
var CI = new circle (2);
C1.color =”red”;
C1.x = 20;
C1.y = 123;
C1.info()
###以上為javascript物件導向作法。
###26JS_OOP.html
###26JS_OOP2.html
###26JS_OOP3.html
#拜訪?DOM
拜訪的目的是節點樹,取到節點的質。
JQ也可以 選擇器的表示法去找到節點
空質+動態資料
拜訪空動態資料
到時會銜接到api
##父節點必須要取id 定調為根 container
<div id=”myDiv”>
<p>第一段
<p>第二段
<script>
function appendNode() {
var myDiv = document.getElementById("myDiv");
var p = document.createElement("p");
var text = document.createTextNode("第四段");
p.appendChild(text);
myDiv.appendChild(p);
}
</script>
Last updated