面向对象编程

PPG007 ... 2021-12-25 About 3 min

# 面向对象编程

# 实例对象与 new 命令

new 命令的工作流程:

  • 创建一个空对象,作为要返回的对象实例。
  • 将这个空对象的原型指向构造函数的 prototype 属性。
  • 将这个空对象赋值给函数内部的 this 关键字。
  • 开始执行构造函数内部的代码。

如果构造函数内部存在 return 语句,而且返回的是一个对象,new 命令会返回 return 指定的对象,否则就会不管 return 语句而返回 this。

函数内部可以使用 new.target 属性,如果当前函数是 new 命令调用,这个属性会指向当前函数,否则返回 undefined。

如果希望从现有对象作为模板创建新的实例对象可以使用 Object.create() 方法。

# this 关键字

this 就是属性或方法“当前”所在的对象。

内层的 this 不指向外部,而是指向顶层对象。

this 的几个使用场合:

  • 全局环境,指向顶层对象 window。
  • 构造函数,指的是实例对象。
  • 对象的方法,指的是方法运行时所在的对象

注意点:

  • 避免多层 this,使用一个变量固定 this 的值然后内层函数调用这个变量。
  • 避免数组处理方法中的 this。
  • 避免回调函数中的 this。

绑定 this 的方法:

  • 函数实例 call 方法,传入一个对象做参数,如果参数为空、null 或 undefined,则默认传入全局对象;如果参数是一个原始值则会转成包装对象,然后再传入 call 方法。call 方法可以接受多个参数,第一个参数做 this,后面的参数是函数调用时的参数。
  • 函数实例 apply 方法,第一个参数是 this 的指向,如果设为 null 或 undefined 等同于全局对象;第二个参数是一个数组,该数组的成员依次传入原函数。
  • 函数实例的 bind 方法,将函数体内的 this 绑定到某个对象然后返回一个新函数,参数就是所要绑定 this 的对象,可以接受更多参数绑定原函数的参数。

# 对象的继承

原型对象 prototype:

每个原型对象都有一个 prototype 属性,指向一个对象,对于构造函数,生成实例的时候,该属性会自动成为实例对象的原型。

原型对象的作用就是定义所有实例对象共享的属性和方法,实例对象可以看作从原型对象衍生出来的子对象。

修改原型对象时一般要同时修改 constructor 属性的指向,指向原来的构造函数。

继承的步骤:

  • 在子类构造函数中调用父类的构造函数。

    function Dog(name) {
    Animal.call(this,name)
    }
    
    1
    2
    3
  • 让子类的原型指向父类的原型

    Dog.prototype = Object.create(Animal.prototype)
    Dog.prototype.constructor = Dog
    
    1
    2

或者直接将子类的原型对象指向一个父类实例。

# Object 对象的相关方法

  • Object.getPrototypeOf():返回参数对象的原型。
  • Object.setPrototypeOf():为参数对象设置原型,返回该参数对象,接受两个参数,第一个是现有对象,第二个是原型对象。
  • Object.create():通过一个现有的实例对象生成另一个实例对象。
  • isPrototypeOf():判断一个对象是否是参数对象的原型。
  • __proto__:返回一个对象的原型,可读可写。
  • getOwnPropertyNames():返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的键名。
  • hasOwnProperty():返回一个布尔值,用于判断某个属性定义在对象自身还是定义在原型链上。
Last update: December 25, 2021 14:08
Contributors: PPG007