;----------------------------------
; AHK的對象和類學習心得 By FeiYue
;----------------------------------
一、簡單對象的使用(細節看幫助)
AHK-V1:
簡單數組 arr:=[111, 222]
關聯數組 arr:={x:111, y:222, id:“abc”}
這兩種可以用 arr[1] 或 arr.x 中括號或點來混合讀寫
AHK-V2:
簡單數組 arr:=[111, 222]
關聯數組 arr:=Map(“x”,111, “y”,222, “id”,“abc”)
原始對象 arr:={x:111, y:222, id:“abc”}
前兩種應該用 arr[1]、arr[“x”] 中括號來讀寫
第三種應該用 arr.x 點來讀寫,不能混用
二、類的使用(復雜對象,包含數據和方法,還可生成新的實例)
AHK的繼承類似Lua和JS,是基于原型的,原型是一個普通的父對象。
原型繼承的原理很簡單,就是找不到就找原型對象,再找不到就再找原型對象。
Lua的繼承原理:
- 繼承鏈:
——>子表中找不到屬性或方法
——>設置元表:setmetatable(子表, 元表對象={__index=父表}),
元表對象是過渡對象,可以使用下面的技巧省去過渡對象,
父表.__index=父表, setmetatable(子表, 父表)
——>在元表對象的__index屬性指向的父表中找,如果找不到
——>設置元表:setmetatable(父表, 元表對象={__index=祖父表})
如果把父表看做類,那么繼承的是類的本身對象。
AHK-V1的繼承原理(類似Lua):
-
繼承鏈:
——>子對象中找不到屬性或方法
——>設置基對象:(一般通過new自動設置)子對象.base:=父對象
——>再在父對象中找,先考慮其中的元函數__Get沒有明確return,如果找不到
——>設置基對象:父對象.base:=祖父對象
如果把父對象看做類,那么繼承的是類的本身對象。 -
new的處理:子對象:=new 父對象() (這里的父對象一般為類)
——>父對象的非靜態屬性賦值給子對象,并運行__new()方法初始化子對象
——>設置基對象:子對象.base:=父對象
父對象的靜態屬性可以被父對象本身使用,非靜態屬性不能。 -
extends的處理:class 子類 extends 父類
——>子類.base:=父類
JS的繼承原理:
-
繼承鏈:
——>子對象中找不到屬性或方法
——>設置原型:(一般通過new自動設置)子對象.proto=父對象.prototype
——>在父對象.prototype屬性對應的對象中找,如果找不到
——>設置原型:父對象.prototype.proto=祖父對象.prototype
如果把父對象看做構造函數,那么繼承的是構造函數的prototype屬性對應的對象。 -
new的處理:子對象=new 父對象() (這里的父對象一般為構造函數)
——>父對象的屬性和方法初始化到 父對象.prototype屬性對應的對象中
,并運行constructor()方法初始化子對象
——>設置原型:子對象.proto=父對象.prototype -
extends的處理:class 子對象 extends 父對象
——>設置原型:子對象.Prototype.proto=父對象.Prototype
AHK-V2的繼承原理(類似JS):
-
繼承鏈:
——>子對象中找不到屬性或方法
——>設置基對象:(一般通過new自動設置)子對象.base:=父對象.Prototype
——>再在父對象.Prototype屬性對應的對象中找,
先考慮其中的元函數__Get沒有明確return,如果找不到
——>設置基對象:父對象.Prototype.base:=祖父對象.Prototype
如果把父對象看做類,那么繼承的是類的Prototype屬性對應的對象。 -
new的處理:子對象:=父對象() (這里的父對象一般為類)
——>父對象的非靜態屬性和非靜態方法初始化到 父對象.Prototype屬性
對應的對象中,并運行__new()方法初始化子對象
——>設置基對象:子對象.base:=父對象.Prototype
父對象的靜態屬性和靜態方法、嵌套類不被子對象繼承,由父對象本身使用。 -
extends的處理:class 子類 extends 父類
——>設置基對象:子類.base:=父類(用于子類操作父類的靜態屬性和靜態方法)
——>設置基對象:子類.Prototype.base:=父類.Prototype(用于實例對象繼承)