JavaScript:面向对象与原型

1、什么是面向对象程序员

  对象并非计算机领域凭空造出来的概念,它是顺着人类思惟模式产生的一种抽象,面向对象编程也被认为是:更接近人类思惟模式的一种编程范式。编程

  对象有以下几个特征:编程语言

  1. 对象具备惟一标识性:即便彻底相同的两个对象,也并不是同一个对象。各类语言的对象惟一标识性都是用内存地址来体现的
  2. 对象有状态:同一对象可能处于不一样状态之下。
  3. 对象具备行为:对象的状态,可能由于它的行为产生变迁

  在JavaScript中,任何不一样的 JavaScript 对象实际上是互不相等的。关于对象的“状态和行为”,JavaScript 中的行为和状态都能用属性来抽象。函数

  JavaScript还有其独有的特色:对象具备高度的动态性,这是由于 JS 赋予了使用者在运行时为对象添改状态和行为的能力。性能

  JavaScript有两种属性:数据属性和访问器属性。this

  数据属性:prototype

  • value:就是属性的值。
  • writable:决定属性可否被赋值。
  • enumerable:决定 for in 可否枚举该属性。
  • configurable:决定该属性可否被删除或者改变特征值。

  访问器属性:(建立对象时可使用get和set关键字来建立访问器属性)设计

  • getter:函数或 undefined,在取属性值时被调用。
  • setter:函数或 undefined,在设置属性值时被调用。
  • enumerable:决定 for in 可否枚举该属性。
  • configurable:决定该属性可否被删除或者改变特征值。

2、JavaScript的原型系统对象

  在不一样的编程语言中,设计者也利用各类不一样的语言特性来抽象描述对象。最为成功的流派是使用“类”的方式来描述对象,这诞生了诸如 C++、Java 等流行的编程语言。这个流派叫作基于类的编程语言。还有一种就是基于原型的编程语言,它们利用原型来描述对象,好比JavaScript。ip

  • “基于类”的编程提倡使用一个关注分类和类之间关系开发模型。
  • “基于原型”的编程看起来更为提倡程序员去关注一系列对象实例的行为,然后才去关心如何将这些对象,而不是将它们分红类。

  从 ES6 开始,JavaScript 提供了 class 关键字来定义类,这样的方案仍然是基于原型运行时系统的模拟

  JavaScript 的原型:若是全部对象都有私有字段 [[prototype]],就是对象的原型;读一个属性,若是对象自己没有,则会继续访问对象的原型,直到原型为空或者找到为止。

  

  从 ES6 以来,JavaScript 提供了一系列内置函数,以便更为直接地访问操纵原型。三个方法分别为:

  • Object.create 根据指定的原型建立新对象,原型能够是null;
  • Object.getPrototypeOf 得到一个对象的原型。
  • Object.setPrototypeOf 设置一个对象的原型。

  

  在 ES3 和以前的版本中,“类”的定义是一个私有属性 [[class]],其访问方式是 Object.prototype.toString。

  在 ES5 开始,[[class]] 私有属性被 Symbol.toStringTag 代替,Object.prototype.toString 的意义从命名上再也不跟 class 相关。

  

  new 操做在建立对象的时候具体作了哪些事情:

  1. 以构造器的 prototype 属性(注意与私有字段 [[prototype]] 的区分)为原型,建立新对象;
  2. 将 this 和调用参数传给构造器,执行;
  3. 若是构造器返回的是对象,则返回,不然返回第一步建立的对象。

  new 这样的行为,试图让函数对象在语法上跟类变得类似,可是,它客观上提供了两种方式,一是在构造器中添加属性,二是在构造器的 prototype 属性上添加属性。

  ES6 中引入了 class 关键字,而且在标准中删除了全部 [[class]] 相关的私有属性描述,类的概念正式从属性升级成语言的基础设施,今后,基于类的编程方式成为了 JavaScript 的官方编程范式。咱们经过 get/set 关键字来建立 getter,经过括号和大括号来建立方法,数据型成员最好写在构造器里面。

相关文章
相关标签/搜索