jaksgfdshkv

原型

通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 __proto__。

__proto__ 是非标准属性。

实例对象可以直接访问原型对象成员。

总结:

1、任何函数都具有一个 prototype 属性,该属性是一个对象

2、构造函数有一个protoType属性,它本身是一个对象,我们称之为原型

3、构造函数的protoType原型对象的属性和方法,都可以被构造函数实例化的对象所继承

4、构造函数的protoType原型对象有个constructor属性,指向的是当前原型对象所在的构造函数

5、实例对象有__proto__属性,它是一个指针,指向的是构造函数的的原型prototype

6、实例对象都具有一个 constructor 属性,指向创建该实例的构造函数

实例化对象的查找规则

了解了 构造函数-实例-原型对象 三者之间的关系后,接下来我们来解释一下为什么实例对象可以访问原型对象中的成员。每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。

搜索首先从对象实例本身开始。如果在实例中找到了具有给定名字的属性,则返回该属性的值。如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。

如果在原型对象中找到了这个属性,则返回该属性的值也就是说,在我们调用对象.属性的时候,会先后执行两次搜索:

首先,解析器会问:“实例 person1 有 sayName 属性吗?”答:“没有。

”然后,它继续搜索,再问:“ person1 的原型有 sayName 属性吗?”答:“有。”于是,它就读取那个保存在原型对象中的函数。当我们调用 person2.sayName() 时,将会重现相同的搜索过程,得到相同的结果。

而这正是多个对象实例共享原型所保存的属性和方法的基本原理。

总结

先在自己身上找,找到即返回,自己身上找不到,则沿着原型链向上查找,找到即返回,如果一直到原型链的末端还没有找到,则返回 undefined

实例对象读写原型对象成员

改变this指向的方法

(1)、call方法

1、call()方法可以进行普通函数的调用

2、call()方法可以改变this的指向,如果没有参数,this指向window

3、call()方法可以改变this的指向,如果有一个参数,this指向该参数

4、call()方法可以改变this的指向,如果有多个参数,this指向第一个参数,剩下的是个参数列表(构造函数继承的案例)

(2)、apply方法

1、 apply()方法可以进行普通函数的调用

2、apply()方法可以改变this的指向,如果没有参数,this指向window

3、apply()方法可以改变this的指向,如果有一个参数,this指向该参数

 4、apply()方法可以改变this的指向,如果有多个参数,第一个参数是null或者window,第二个参数是数组

  1. bind()不能进行函数的调用
  2. 可以改变this指向

posted on 2021-12-12 17:44  jaksgfdshkv  阅读(57)  评论(0编辑  收藏  举报

导航