You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
類別語法並不是要引入新的物件導向繼承模型到 JavaScript 中,而是提供一個更簡潔的語法來建立物件和處理繼承。
(JavaScript classes, introduced in ECMAScript 2015, are primarily syntactical sugar over JavaScript's existing prototype-based inheritance. The class syntax does not introduce a new object-oriented inheritance model to JavaScript.)
ES6 class
// class 像是一個設計圖classDog{setName(name){this.name=name// 這裡的 this 就是呼叫他的人,操控這個 instance 的人,在這裡就是 dconsole.log('this-->',this)// Dog {name: "PooBoo"}}sayHello(){console.log(this.name)}}vard=newDog()// instance : 用 new 這個關鍵字去實體化d.setName('PooBoo')d.sayHello()vard2=newDog()console.log(d.sayHello()===d2.sayHello())// true
ES6 class - Constructor
classDog{// 在 new 的時候,其實就是在 call 這個 constructor // 在被 new 時就會 call 這個 function 所以很適合做一些初始化的事情constructor(name){this.name=name}}vard=newDog('aaa')// new 時帶入參數
ES5 的 class 做了什麼
用一個 function 去實作 constructor
用 prototype 去實作 method
♥♥♥
ES5 裡可以把一個 function 當作一個 constructor 用,new 一個 function 產生一個 instance,背後的機制 javascript 會做好
---> 屬性,method 都放在 constructor
// 這個 function 就是 constructorfunctionDog(name){this.name=namethis.getName=function(){returnthis.name}}varb=newDog('FooPan')vard=newDog('BooPoo')console.log(b.getName==d.getName)// false,如果這樣寫 new 幾個 Dog 就會有幾個 getName function// 因為 function 記憶體位置是不一樣的// 比較好的寫法是 Dog.prototype.getName
// 使用 prototype 寫法functionDog(name){this.name=name}}// 在 Dog 的 prototype 上加一個 functionDog.prototype.getName=function(){returnthis.name}Dog.prototype.sayHello=function(){console.log(this.name)}varb=newDog('FooPan')vard=newDog('BooPoo')console.log(d)// d 就是 Dog 的 instanceconsole.log(b.getName===d.getName)// true// d.__proto__ 是什麼{getName: ƒ,sayHello: ƒ,constructor: ƒ}// Dog.prototype(d.__proto__) 有 method and constructorconsole.log(d.__proto__===Dog.prototype)// trueconsole.log(Dog.__proto__===Function.prototype)// true
instance 和 prototype 之間是如何串連的
透過屬性 __proto__
在 new 一個 instance 時,javascript 就幫你加了一個屬性 __proto__
soo.__proto__===Dog.prototype// true
從 prototype 來看「原型鍊」__proto__
instance 身上有 getName (但這樣就會有一直重複複製相同的 function 的問題)
物件導向的基礎
(這是一個箱子裡,有多個你已定義好的功能(你想要的功能),有需要你可以一直複製相同箱子的故事)
(在物件導向的世界裡,不太會有直接去 call 一個 function 的情形,例如 add(),通常會是對一個物件做操作,例如:obj.add())
ECMAScript 6 中引入了類別 (class) 作為 JavaScript 現有原型程式(prototype-based)繼承的語法糖。
類別語法並不是要引入新的物件導向繼承模型到 JavaScript 中,而是提供一個更簡潔的語法來建立物件和處理繼承。
(JavaScript classes, introduced in ECMAScript 2015, are primarily syntactical sugar over JavaScript's existing prototype-based inheritance. The class syntax does not introduce a new object-oriented inheritance model to JavaScript.)
ES6 class
ES6 class - Constructor
ES5 的 class 做了什麼
♥♥♥
ES5 裡可以把一個 function 當作一個 constructor 用,new 一個 function 產生一個 instance,背後的機制 javascript 會做好
---> 屬性,method 都放在 constructor
instance 和 prototype 之間是如何串連的
__proto__
__proto__
從 prototype 來看「原型鍊」
__proto__
instance 身上有 getName (但這樣就會有一直重複複製相同的 function 的問題)
結論:
d 的 instance 身上沒有 sayHello,所以往上找 proto
prototype chain 原型練
d.sayHello()
查找順序
d
身上有沒有 sayHello
d.__proto__
有沒有 sayHello
d.__proto__.__proto__
有沒有 sayHello
d.__proto__.__proto__.__proto__
有沒有 sayHello // null
null
出現代表已經是最上層了string.toUpperCase
透過
__proto__
這個屬性,可以知道 s.toUpperCase 就是 String.prototype.toUpperCase() 這個 functionnew 做了什麼事?
__proto__
產生關聯物件導向的繼承:Inheritance
繼承就像人會遺傳父母的DNA
BlackDog 自己加上 constructor
參考文章
Classes
The text was updated successfully, but these errors were encountered: