Object create() 方法

了解 JavaScript Object 原型上 create() 方法的相關資訊。 在 ES5 中引入。 用於創建一個新的對象,並指定其原型。 使用方法: const newObject = Object.create(prototype) 範例: const animal = {} const dog = Object.create(animal) 新創建的對象將繼承所有原型對象的屬性。 您可以指定第二個參數以添加原型缺失的新屬性給對象: const newObject = Object.create(prototype, newProperties) 其中 newProperties 是一個對象,其中定義了每個屬性。 範例: const animal = {} const dog = Object.create(animal, { breed: { value: 'Siberian Husky' } }); console.log(dog.breed) //'Siberian Husky' 我並沒有只寫 breed: 'Siberian Husky',而是必須傳遞一個屬性描述對象,定義在本頁開頭。 Object.create() 經常與 Object.assign() 結合使用: const dog = Object.assign(Object.create(animal), { bark() { console.log('bark') } })

Object的isPrototypeOf()方法

了解JavaScript的Object.isPrototypeOf()方法 isPrototypeOf()是在一個物件實例上調用的,它接受一個物件作為參數。如果你調用isPrototypeOf()的物件出現在傳入的物件的原型鏈中,它將返回true,否則返回false。 範例: const Animal = { isAnimal: true } const Mammal = Object.create(Animal) Mammal.isMammal = true Animal.isPrototypeOf(Mammal) //true const dog = Object.create(Animal) Object.setPrototypeOf(dog, Mammal) Animal.isPrototypeOf(dog) //true Mammal.isPrototypeOf(dog) //true

為什麼不應該修改 JavaScript 物件的原型

了解為什麼不應該修改 JavaScript 物件的原型,以及應該做什麼 作為程式設計師,我們必須首先學會的技能之一就是如何尋找解決方案。 Google 是你的朋友。而大多時候,一個來自 2009 年的 StackOverflow 解答能夠完美解決你在 2019+ 的問題。 在該網站或個人部落格上,有時候我會看到一些修改內建物件原型的程式碼。 就像這個例子,它擴充了 Array 物件的原型,增加了一個 insert 方法: Array.prototype.insert = function(index, item) { this.splice(index, 0, item) } 這樣一來,你可以對任何陣列調用 insert() 方法: ['red', 'blue'].insert(0, 'yellow') 這樣很方便。你不需要定義這樣的函式,也不需要擔心作用域的問題,只需將它附加到 Array 物件上,這樣每個陣列都可以使用它。 但僅僅因為你能這麼做,並不意味著你應該這樣做。 這種方法有什麼問題呢? 可能的衝突 假設你使用的一個函式庫實現了這樣的功能。而你引入的另一個函式庫也做了同樣的事情。可能這些方法稍有不同,看起來好像一切都順利,直到事情不好時。 你會有一個大問題,因為你無法修改這些函式庫,但你仍然希望使用它們。 未來護航你的程式碼 假設下一個 JavaScript 版本實作了 Array.insert 方法,但參數簽名不同。現在會發生什麼?你需要回頭重寫所有的程式碼。也許是為了一個你不再工作的客戶。 或者你可能在一個被其他人在他們自己的專案中使用的函式庫中這樣做,那就更糟糕了。 這種做法只會造成技術債務,並且很容易引發問題。 你應該做什麼? 在程式庫檔案中創建一個函式,需要時導入它。不要修改你無法控制的對象。