对前端知识一直都是一知半解,现在重新学习,只学要用到的内容,这篇是javascript中的类。
ES 5 中定义类:
function Rabbit() { }
ES 6 中定义类:
class Rabbit { }
类和对象之间的关系:
class Rabbit { }
const r1 = new Rabbit();
类和对象之间是通过原型关联起来的,原型的出现是为了实现面向对象,避免类型丢失。具体来说就是对象的隐式原型__proto__ 等于 类的 prototype:
r1.__proto__ === Rabbit.prototype // true
面向对象要求所有的对象都必须属于一个类
const obj = {}
看一下原型关系
obj.__proto__ === Object.prototype // true
可以把 const obj = {} 理解为下面的简写:
const obj = new Object()
但是Js又不是一个严格的面向对象的语言
const obj2 = Object.create(null) //undefined
obj2.__proto // undefined
obj2没有隐式原型,是因为Js不是一个严格的面向对象的语言。
一般的面向对象语言,一个兔子类的对象一旦创建,它就永远属于兔子类,但是在Js中,可以通过改变兔子的对象的__proto__来让它变成一个苹果的对象。真是神奇噢
类的本质就是用来描述具有相同特征的对象,它描述的是这些对象的相同特征。
兔子的特征有什么?毛发、颜色、体重、身高、年龄、吃、睡、跳等等。
兔子的这些特征我们在类中描述,而不是在对象中描述,面向对象他认为某一个对象的特征分为两大类,一类是属性,一类是方法。属性是名词,方法是动词,在Js里面表现为函数。
对象的特征到底什么时候描述呢,面向对象认为,我们在类中有两个时间节点,可以来进行具体的描述。第一个时间节点是对象创建时,第二个时间节点是动作产生时。一个类的不同对象都拥有相同的特征,但是会有不同的特征值。