程式語言:JavaScript
簡介:如何宣告和應用
同樣名字的變數,子物件會覆蓋母物件,但若是 private 的,則會維持
呼叫時,尋找的方式為 子 -> 母 -> 祖 -> ...,直到找不到則回傳 undefined
檢查是否存在屬性的 hasOwnProperty,也是在 prototype 中
故所有物件皆有此 function
簡單範例:
因 foo() 前,無調用物件,故為 window
複雜範例:
若無法確定 this,建議直接指定,可用 call or apply
兩者差異只在傳入的參數方式不同
簡介:如何宣告和應用
function Obj(y) { // public 可被繼承 this.x = 10; // 第一種寫法 this["y"] = y; // 第二種寫法 this.z = function() // 新增 z function { console.log(this.x) console.log(this.y) console.log(a) // >> 3 return this.x; } // private 只可見於 function 內,不可被繼承,外部無法使用 var a = 3; var b = function() { console.log(a) return a; } } Obj.xx = 10; // 第三種寫法 Obj.["yy"] = "yy"; // 第四種寫法 var obj = new Obj("y") console.log(obj.a) // >> undefined obj.z() // >> 10, 'y', 3
同樣名字的變數,子物件會覆蓋母物件,但若是 private 的,則會維持
呼叫時,尋找的方式為 子 -> 母 -> 祖 -> ...,直到找不到則回傳 undefined
function Inherit(x, y, t) // inherit from Obj { this.prototype = Obj; // 無法使用 new Obj(y) this.prototype(y); //初始化 Obj this.x = 100; // 覆蓋母物件 Obj 的 x this.t = t; a = 5 // 不會更改母物件 Obj 的 a } // Inherit.prototype = new Obj(y); // 在外部可使用 var inherit = new Inherit(1, "z", 30) // z() 原為 >> 10, 'y', 3 inherit.z() // >> '100', 'z', 3 // a 仍然為 3 inherit.prototype.all = 3 // Inherit 加入 all 變數,原型已被更改 inherit.only = 3 // inherit 加入 only 變數,原型未更改
prototype
prototype 是個物件檢查是否存在屬性的 hasOwnProperty,也是在 prototype 中
故所有物件皆有此 function
var prototypeType = typeof Object.prototype console.log(prototypeType); // >> object var hasOwn = Object.prototype.hasOwnProperty("hasOwnProperty"); console.log(hasOwn); // >> true
This 討論
this 的決定,依誰呼叫為主- 物件.函式() => 函式內的 this 指向該物件
- New 物件 => 建立時 this 指向該物件
- 函式() => 函式內的 this 指向全域物件,也就是 window
function A() { this.b = 'a' console.log(this) } A() // >> window a = new A() // >> Object { b: "a" }
簡單範例:
因 foo() 前,無調用物件,故為 window
var A = { f: function () { console.log(this); // >> Object { f: A.f() } var foo = function () { console.log(this); } foo(); // >> window } }; A.f(); // Output // >> Object { f: A.f() } // >> window
複雜範例:
var x = 'window'; var A = { x:'A', f: function(){ console.log(this.x); } }; A.f(); // >> A var fOut = A.f; fOut(); // >> window var B = { x:'B', f : A.f } B.f(); // >> B
若無法確定 this,建議直接指定,可用 call or apply
兩者差異只在傳入的參數方式不同
//函式的 this 指向 B物件(若 B物件為 null,則指向全域物件) (A物件.)函式.call(B物件,參數1,參數2,參數3, ......); //函式的 this 指向 B物件(若 B物件為 null,則指向全域物件) (A物件.)函式.apply(B物件,[參數1,參數2,參數3, ......]);
留言
張貼留言