• 创建对象方法
  • 原型、构造函数、实例、原型链关系
  • instanceof、new 原理
  • 类继承

创建对象

  1. var obj = {name: 'object'} //字面量方式
  2. function constructor() { //构造函数
  3. this.name = 'object'
  4. }
  5. var obj = new constructor
  6. var obj = Object.create({name: 'object'}) //Object.create

原型、构造函数、实例、原型链关系

image.png

构造函数都有属性 prototype ,叫原型对象
原型对象的属性 constructor 等于 构造函数

构造函数通过new 创建 实例
实例私有属性 proto 等于 构造函数prototype

MDN

instanceof、new 原理

instanceof运算符判断 构造函数的原型对象 是否出现在对象的原型链

  1. function _instanceof(instance, constructor) {
  2. if(instance.__proto__ === null) return false;
  3. if(instance.__proto__ === constuctor.prototype) return true;
  4. return _instanceof(instance.__proto__, constructor);
  5. }

new 运算符

  1. 创建一个空对象,且连接 构造函数原型对象
  2. 构造函数调用 call方法 把 this 空对象上调用。
  3. 如果call返回类型是 对象, 就返回这个对象,否则就返回步骤1空对象。
  1. function new(constructor) {
  2. var obj = Object.create(constructor.prototype);
  3. var callResult = constructor.call(obj);
  4. return typeOf callResult === 'object' ? callResult : obj;
  5. }

MDN new运算符

类继承

继承父类静态属性 和 连接父类原型对象。

构造函数和原型链组合型

  1. function parent(){
  2. this.parent = 'parent';
  3. }
  4. function children() {
  5. parent.call(this);
  6. this.children = 'parent';
  7. }
  8. children.prototype = Object.create(parent.prototype);
  9. children.prototype.constructor = children;