对象解析
javascript 本质没有 Class, 原型继承
javascript 对象:实例对象、函数对象、原型对象
实例对象
1 | var people = new Student() |
构造函数在实例对象创建后进行调用,作用是对实例对象进行初始化操作
原型对象:实例对象和函数对象的父对象
1 | function people(name){ |
proto
表示:实例对象通过 __proto__
直接访问原型对象
除了 null undefined,javascript 中所有对象、原始类型都有 proto 属性
通过 __proto__ 属性修改对象的原型:非常慢且影响性能
ECMAScript 2015 规范中被准确的定义
获取、设置对象的原型
Object.getPrototypeOf、setPrototypeOf
Reflect.getPrototypeOf、setPrototypeOf
prototype
表示:构造函数通过 prototype
直接访问原型对象
构造函数都包含该属性(new 操作符生成的对象
),指向原型对象
实例对象(__proto__) === 构造函数(prototype)
1 | // 因为Object是一个函数,函数的构造器都是Function |
constructor
原型对象的属性,指向构造函数
关系图
原型链
实例对象.proto.proto.proto.null
代码示例
1 | function Person(name){ |
New 原理
1 | function New(Fn) { |
- 创建一个新对象
- 将构造函数的作用域赋给新对象(this 指向新对象)
- 执行构造函数中的代码(为新对象添加属性)
- 返回新对象
演示示例
1 | var Person = { |