V8实现对象继承

目录

  • 1. 继承
  • 2. 基于类的设计
  • 3. 基于原型的设计
    • 3.1 原型
    • 3.2 对象 构造函数 原型对象 原型链
  • 4. 实践:原型代理

1. 继承

V8实现对象继承_第1张图片
继承简单来说就是,一个对象可以返回另一个对象的属性和方法。

2. 基于类的设计

提倡使用一个关注分类和类之间关系开发模型。
在这类语言中,总是先有类,再从类去实例化一个对象。类与类之间又可能会形成继承、组合等关系。

3. 基于原型的设计

基于原型的继承通过复制的方式来创建新对象复制有两种思路:

  • 一个是并不是真的去复制一个原型对象,而是使得新对象持有一个原型的引用;
  • 另一个是切实地复制对象,从此两个对象再无关联。

3.1 原型

所有的对象类型都有__proto__这个字段,
V8实现对象继承_第2张图片
V8实现对象继承_第3张图片

3.2 对象 构造函数 原型对象 原型链

 // 构造函数
  function Person () {

  }

  // 原型对象
  Person.prototype = {
      count: 2
  }

  // 实例
  const man = new Person()  //Person 实例  1.创建一个对象  2. 此对象的__proto__ 指向Person.prototype
  console.log(man.__proto__ === Person.prototype) // true   原型链继承
  console.log(Object.__proto__)
  console.log(Person.prototype.__proto__ === Object.prototype)   // Object Object构造函数


  // 原型链
  let obj = {}
  console.log(obj.a) // undefined                 第一步从obj自身找b,找不到进入下一步
  console.log(obj.__proto__.a) // undefined       第二步在obj原型上的原型对象找a属性
  console.log(obj.__proto__.__proto__)  // null   再通过obj原型上的原型对象的原型的原型对象上找a属性,直到返回的原型对象是null为止

4. 实践:原型代理

侦测一个数组数据的变化,变异方法,改变数组自身的值。

  const methods = [
      'push',
      'shift',
      'unshift',
      'splice',
      'sort',
      'reverse'
  ]

  const arrMethods = Object.create(Array.prototype)

  methods.forEach(method => {
      arrMethods[method] = function () {
          // console.log('已经被拦截',this,arguments)
          Array.prototype[method].apply(this,arguments)
      }
  })

  let arr = [1,2,3,4,5]
  arr.__proto__ = arrMethods
  arr.push(6)
  console.log(arr)   // [1,2,3,4,5,6]

你可能感兴趣的:(Google,V8,底层机制和原理,javascript,原型模式,前端)