对象的原型:
JavaScript中每个对象都有一个特殊的内置属性[[prototype]],这个特殊属性指向另外一个对象。
当我们访问一个对象上的某个属性时,首先会检查这个对象自身有没有这个属性,如果没有就会去[[prototype]]指向的对象查找。
那么这个特性就可以帮助我们实现继承了。
如何获取到这个[[prototype]]属性指向的对象?
方法一:通过对象的__proto__属性可以获取到(但这个属性是早期浏览器自己添加的,存在一定兼容性问题),建议开发测试用。
方法二:通过Object.getPrototypeOf方法获取,可以在生产环境使用。
Object.setPrototypeOf(对象,原型) 方法可为某个对象指定原型。(了解即可)
函数的原型:
所有函数都有一个prototype属性
new操作会进行如下四步:
1.创建一个新对象
2.将构造函数的this绑定到这个对象
3.这个对象内部的[[prototype]]属性(一般是__proto__)会被赋值为该构造函数的prototype
4.构造函数返回该对象
原型继承关系图:
this
作用:提供一种在对象方法中引用当前对象的方式。
this是在运行时被绑定的;
默认绑定:当函数在非严格模式下独立调用时,this默认绑定到全局对象(浏览器中是window对象,在Node中是global对象),严格模式下,this是undefined。优先级最低
隐式绑定:当函数作为对象的方法被调用时,this绑定到该对象。
显式绑定:通过call、apply、bind方法,显式指定this绑定的对象。call和apply会立即调用函数并传递this,而bind会返回一个新的函数并绑定着指定的this。优先级高于隐式绑定
new绑定:通过new关键字调用构造函数时,this绑定到新创建的对象实例。优先级高于bind
初以上四种规则外,还需注意箭头函数中:
箭头函数不会创建自己的this,他会使用外部作用域的this值,通常是定义箭头函数时所在的上下文。并且是固定的不能被call等改变。