什么是原型对象?

我们只要创建一个函数,都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象包含特定类型所有实例共享的属性和方法。

为什么要使用原型对象?

为了解决函数在创建实例的时候。重复执行造成性能的降低(就是指内存的占用浪费),将函数写在外面,有可能造成函数覆盖。

获取原型:函数.prototype

函数通过prototype属性,找到自己的原型对象,原型对象通过constructor属性可以找到自己的构造函数;

原型对象身上的属性:constructor,找到自己的函数

实例的属性:__proto__,找到实例对应的原型对象(非标准属性。生产环境上不建议使用)

实例默认可以访问自己构造函数原型上的属性 

原型对象也是通过被其他函数new出来的一个实例,所以也有__proto__属性,一直往上找,最终找到的是null;

从实例-->null原型之间的关系,我们把他们称为原型链。

规则:先在自己身上找,如果没有,沿着原型链往上找,找不到就继续往上找,一直找到null为止,如果找到null都没有,就返回undefined

JavaScript原型以及原型链

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被指定了。

相关文章: