什么是原型对象?
我们只要创建一个函数,都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象包含特定类型所有实例共享的属性和方法。
为什么要使用原型对象?
为了解决函数在创建实例的时候。重复执行造成性能的降低(就是指内存的占用浪费),将函数写在外面,有可能造成函数覆盖。
获取原型:函数.prototype
函数通过prototype属性,找到自己的原型对象,原型对象通过constructor属性可以找到自己的构造函数;
原型对象身上的属性:constructor,找到自己的函数
实例的属性:__proto__,找到实例对应的原型对象(非标准属性。生产环境上不建议使用)
实例默认可以访问自己构造函数原型上的属性
原型对象也是通过被其他函数new出来的一个实例,所以也有__proto__属性,一直往上找,最终找到的是null;
从实例-->null原型之间的关系,我们把他们称为原型链。
规则:先在自己身上找,如果没有,沿着原型链往上找,找不到就继续往上找,一直找到null为止,如果找到null都没有,就返回undefined
instanceof作用:判断一个函数的原型对象是否在实例的原型链上。
this的指向:(谁调用,指向谁)
原则:①判断this在哪个函数中②这个函数式哪种调用模式调用的
函数中的this的指向是由函数被调用的那一刻就被确定下来的。
普通函数调用:this-->window
对象调用:this-->obj
new调用:新创建出来的实例对象
注册事件:this-->盒子
定时器this-->window
上下文调用模式:想让this指向谁就指向谁(其实是js中提供的三个方法)
①函数.call(第一个参数:想让函数中的this指向谁,就传递谁进来,后面的参数:本身函数需要传递实参,需要几个实参,就一个一个的传递即可);
call的作用:1.调用函数2.指向函数中的this指向
②函数.apply(第一个参数:想让函数中的this指向谁,就传递谁进来,第二个参数:传递一个数据,数组中包含函数需要的实参)
③函数.bind(第一个参数:想让函数中的this指向谁,就传递谁进来,后面的参数:本身函数需要传递实参,需要几个实参,就一个一个的传递即可);
bind的用法虽然和call相同,但是作用不同,bind的作用是:1.克隆当前函数,返回克隆出来的新的函数2.新克隆出来的函数,这个函数的this被指定了。