在社会上,评价一个人的能力和价值时,往往有两种不同的标准:一是“以关系为准”,二是“以能力为准”。这两个标准都体现在不同的文化、行业和个人价值观中,每个标准都有自己的支持者和反对者。
在编程语言中,有两种标准以不同的方式组织代码,将数据结构链接到函数。本文将简要讨论这两个通用标准的应用和作用原理。
在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