前端问题清单——类?原型?

167 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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,在定义的类的时候使用classfunction回归原本函数的含义,并且标准中删除了[[class]]的私有属性描述,所以类这种编程也成了官方的编程范式。

类也是运行在原型运行时之上的,逻辑上JavaScript认为每个类是有共同原型的一组对象。通过class写法定义的方法和属性也会被写在原型对象之上。

在声明一个类的时候,首先是构造器函数constructor,然后是通过关键字setget来创建settergetter,一般数据型成员会写到settergetter中,以及类包含的方法。

类还提供了继承的能力,使用关键字extend自动调用父类的构造函数。

总结

JavaScript的对象设计很特别,可以通过原型创建对象,也可以通过声明一个类然后实例化一个对象。所以,JavaScript是面向对象的,并且是高度动态的。