1.JS 构造对象目前有两种方式,一种是用构造函数+prototype,一种是用 class,关于这两种方式
-
两者方式 JS 都支持,JS 是一门包容的语言,提供了多种表达形式,两者方式都能表达程序员的思想。
-
构造函数+prototype 是先提供的,class 是后提供的,说明 构造函数+prototype 是 JS 一开始的基因,而 class 的粉丝其实更喜欢 class,所以两种都有必要学习
2.关于「原型」,假设 x 均代表普通对象
-
「x 的原型」等价于「x.__proto__ 所指的对象」 ,有时为了方便,我们可以认为「x 的原型」等价于「x.__proto__ 」
-
一个对象的原型指的是这个对象与其他同类对象的公有属性的集合,比如 obj1 和 ob2 同时拥有 toString / valueOf,那么 toString / valueOf 等属性组成的对象,就是 obj1 和 obj2 的原型,这个原型的地址一般储存在构造函数的 prototype 里
-
-
x.__proto__和 Object.prototype 存储着同一个对象的地址,这个对象就是 x 的原型
-
-
每个对象都有原型,但除了「根对象 Object.prototype」比较特殊,Object.prototype 这个对象的原型为空 null
3.关于 prototype 属性
-
所有函数一出生就有一个 prototype 属性
-
所有 prototype 一出生就有一个 constructor 属性
-
所有 constructor 属性一出生就保存了对应的函数的地址
-
如果一个函数不是构造函数,它依然拥有 prototype 属性,只不过这个属性暂时没什么用
-
如果一个对象不是函数,那么这个对象一般来说没有 prototype 属性,但这个对象一般一定会有 __proto__ 属性
4.new X() 操作其实自动帮我们做了很多事情,这些事情包括
-
自动创建一个空对象
-
自动将该空对象的原型指向 X.prototype(即将 X.prototype 保存的地址复制到空对象.__proto__ 里)
-
自动将空对象作为 this 来运行构造函数
-
自动 return this
5.关于类型 和 类
-
类型是对 JS 中数据的分类
-
类是对 JS 中对象的分类
-
JS 中的类型有:数字、字符串、布尔、符号Symbol、null、undefined、对象
-
JS 中的类有:对象 Object、数组 Array、函数 Function 等
6.window.Object 是一个函数对象,这个「函数对象」的构造函数是Function
7.window.Object 是一个函数对象,这个「函数对象」的 __proto__ 是 Function.prototype
8.关于 Object.prototype
-
Object.prototye 是「Object 构造出来的对象 obj」的原型,即 obj.__proto__ === Object.prototype
-
Object.__proto__ 是 Object 的原型,由于 Object 是函数,而所有函数的原型都是 Function.prototype,所以 Object.__proto__ === Function.prototype
-
Object.prototye 不是 Object 的原型,Object.__proto__ 才是 Object 的原型