持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
类or原型
在C++和Java中,描述对象是依赖于类,要关注对象的分类以及类和类之间的关系,比如继承、组合,通常是先声明一个类,再从类实例化一个对象。
原型则是更加关注对象实例的行为,通过复制的方式来生成新对象,可以在运行时对原型进行修改。通过JavaScript的原型系统可以知道在复制生成新对象的时候,并不是复制原型对象,而是新对象有一个原型的引用。
JavaScript的原型
所有对象都有私有字段prototype
如果要读取对象的一个属性,如果对象本身没有就会继续访问对象的原型,直到找到或者原型为空为止
利用原型创建对象
Object.create:根据指定的原型创建对象Object.getPrototypeOf:获取一个对象的原型Object.setPrototypeOf:设置一个对象的原型
let person = {
test(){
console.log('person')
}
}
let student = Object.create(person, {
test(){
console.log('student')
}
})
let LiLei = Obejct.create(person)
Xiaoming.test()
let HanMeiMei = Object.create(student)
HanMeiMei.test()
new
接受一个构造器和一组调用函数:
- 把构造器的
prototype属性为原型,创建新对象 - 把
this和参数传给构造器执行 - 如果构造器返回的是对象就返回,如果不是就返回第一步创建的对象
JavaScript的类
ES6中加入了新特性:class,在定义的类的时候使用class,function回归原本函数的含义,并且标准中删除了[[class]]的私有属性描述,所以类这种编程也成了官方的编程范式。
类也是运行在原型运行时之上的,逻辑上JavaScript认为每个类是有共同原型的一组对象。通过class写法定义的方法和属性也会被写在原型对象之上。
在声明一个类的时候,首先是构造器函数constructor,然后是通过关键字set和get来创建setter和getter,一般数据型成员会写到setter和getter中,以及类包含的方法。
类还提供了继承的能力,使用关键字extend自动调用父类的构造函数。
总结
JavaScript的对象设计很特别,可以通过原型创建对象,也可以通过声明一个类然后实例化一个对象。所以,JavaScript是面向对象的,并且是高度动态的。