在社會上,評價一個人的能力和價值時,往往有兩種不同的標準:一是“以關係為準”,二是“以能力為準” 。這兩個標準都體現在不同的文化、產業和個人價值觀中,每個標準都有自己的支持者和反對者。
在程式語言中,有兩種標準以不同的方式組織程式碼,將資料結構連結到函數。本文將簡要討論這兩個通用標準的應用和作用原理。
在Javascript語言中,提供了class關鍵字,我們可以用它來定義類別。重要的是,類別是可擴展的,當在實例上呼叫方法時,它們會按照原型鏈的順序查找方法定義。例如:
class Animal { move() { return 'move' } } class Monkey extends Animal { jump() { return 'jump' } } class Human extends Monkey { write() { return 'write' } }
extends 關鍵字可以幫助我們定義一個從其他類別擴展的新類別。我們可以得到這樣的原型鏈:
let me = new Human() let proto = me.__proto__ let r = [] while (proto !== null) { r.push(proto.constructor.name) proto = proto.__proto__ }
我們會得到這樣的 r:['Human', 'Monkey', 'Animal', 'Object']。當我們呼叫一個方法時,該方法呼叫是否成功取決於原型鏈上是否有對應的定義。例如呼叫me.move(),它在Animal類別中有定義,呼叫成功。
這就是類別模型,我喜歡稱之為「關係」模型,只要在實例本身的類別中定義就可以調用,或者在父類別、祖父母類別等中定義在。
與基於關係的模型相比,基於能力的模型要簡單得多。只要實例滿足某種特質,無論實例之間的關係為何,對應的方法都可以作用於實例。
let me = { moveable: true, freezable: false } function move(x) { return x.moveable ? 'move' : undefined } function freeze(x) { return x.freezable ? 'freeze' : undefined }
在這個模型中,資料和方法是相互獨立的。優點是簡潔明了,但缺點也很明顯,因為方法和資料的獨立性,很難重寫方法定義。
介紹完資料結構和方法的兩種連接方式,我們可以想到,當需要根據資料的類別來實作同名不同功能的方法時,建議使用關係類別模型。當方法通常相對固定,而資料是多變的,並且相同的方法適用於不同的資料時,可以使用基於能力的模型。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3