JS对象-对象分类、原型对象

557 阅读2分钟

1.JS 构造对象目前有两种方式,一种是用构造函数+prototype,一种是用 class,关于这两种方式

  1. 两者方式 JS 都支持,JS 是一门包容的语言,提供了多种表达形式,两者方式都能表达程序员的思想。
  2. 构造函数+prototype 是先提供的,class 是后提供的,说明 构造函数+prototype 是 JS 一开始的基因,而 class 的粉丝其实更喜欢 class,所以两种都有必要学习

2.关于「原型」,假设 x 均代表普通对象

  1.  「x 的原型」等价于「x.__proto__ 所指的对象」 ,有时为了方便,我们可以认为「x 的原型」等价于「x.__proto__ 」
  2.  一个对象的原型指的是这个对象与其他同类对象的公有属性的集合,比如 obj1 和 ob2 同时拥有 toString / valueOf,那么 toString / valueOf 等属性组成的对象,就是 obj1 和 obj2 的原型,这个原型的地址一般储存在构造函数的 prototype 里
    1. x.__proto__和 Object.prototype 存储着同一个对象的地址,这个对象就是 x 的原型
  3. 每个对象都有原型,但除了「根对象 Object.prototype」比较特殊,Object.prototype 这个对象的原型为空 null

3.关于 prototype 属性

  1.  所有函数一出生就有一个 prototype 属性
  2. 所有 prototype 一出生就有一个 constructor 属性
  3. 所有 constructor 属性一出生就保存了对应的函数的地址
  4. 如果一个函数不是构造函数,它依然拥有 prototype 属性,只不过这个属性暂时没什么用
  5. 如果一个对象不是函数,那么这个对象一般来说没有 prototype 属性,但这个对象一般一定会有 __proto__ 属性

4.new X() 操作其实自动帮我们做了很多事情,这些事情包括

  1.  自动创建一个空对象
  2. 自动将该空对象的原型指向 X.prototype(即将 X.prototype 保存的地址复制到空对象.__proto__ 里)
  3. 自动将空对象作为 this 来运行构造函数
  4. 自动 return this

5.关于类型 和 类 

  1.  类型是对 JS 中数据的分类
  2. 类是对 JS 中对象的分类
  3. JS 中的类型有:数字、字符串、布尔、符号Symbol、null、undefined、对象
  4. JS 中的类有:对象 Object、数组 Array、函数 Function 等

6.window.Object 是一个函数对象,这个「函数对象」的构造函数是Function

7.window.Object 是一个函数对象,这个「函数对象」的 __proto__ 是 Function.prototype

8.关于 Object.prototype

  1.  Object.prototye 是「Object 构造出来的对象 obj」的原型,即 obj.__proto__ === Object.prototype
  2. Object.__proto__ 是 Object 的原型,由于 Object 是函数,而所有函数的原型都是 Function.prototype,所以 Object.__proto__ === Function.prototype
  3. Object.prototye 不是 Object 的原型,Object.__proto__ 才是 Object 的原型

9.所有「函数对象」的「构造函数」都是 Function