原型和原型链

一,认识原型

     大部分函数(重点是构造函数)都内置一个prototype的属性(又叫原型属性或者显式原型),属性值是一个对象,对象中存储的属性和方法是供当前类的所有下属实例,调用的公共的属性和方法。

    注意 : 箭头函数是没有prototype属性的。

                  在原型对象上有一个内置的属性constructor(构造器),属性值是当前函数本身。

二,认识原型链

     每一个对象都内置一个__proto__属性(又叫原型链或者隐式原型),属性值指向自己所属类的原型对象。

     注意 : Object.prototype这个对象的__proto__值是null,因为Object是所有对象的“基类”

三,

        1)函数数据类型包括:

         普通函数

         箭头函数

         生成器函数

         构造函数(类)等等

        2)对象数据类型包括:

         普通对象,日期对象,正则对象,数组对象。。。

         实例也是对象数据类型的(排除7中基本数据类型值)

         prototype/__proto__的属性值也是对象数据类型的(排除Function.prototype)  

四,图解Object Array arr原型和原型链


五,原型链查找机制

首先查找当前实例对象的私有属性,私有中有,获取的就是私有的;如果私有中没有,则浏览器默认基于__proto__找其所属类的原型对象上的公共的属性和方法;如果还找不到,则基于原型对象上的__proto__继续向上查找。。。直到找到Object.prototype为止


例如:

let arr = [10,20]

console.log(arr.hasOwnProperty('push'))

console.log(Array.prototype.hasOwnProperty('push'))

console.log(arr.__proto__.hasOwnProperty('push'))

console.log(Array.prototype === arr.__proto__)

六,

搞清楚,有时候都是调用的公共方法,但是this的指向不一样,结果也不一样

f2.getY() 和f2.__proto__.getY() ,都是原型对象中的getY()方法,但是this的指向不同


你可能感兴趣的:(原型和原型链)