面向对象编程
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():返回一个布尔值,用于判断某个属性定义在对象自身还是定义在原型链上。