H,01

导航

论JS中的原型对象和原型链

原型对象:

JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object ,Function 是JS自带的函数对象。每个对象都有原型(null和undefined除外),你可以把它理解为对象的默认属性和方法。

Object:Object是一个函数对象,Object的原型就是一个Object对象,它里面存在着一些对象的方法和属性,例如最常见的toString方法。

新建对象:用new Object或者{}建的对象是普通对象,它没有prototype属性,只有__proto__属性,它指向Object.prototype。

Array:Array也是一个函数对象,它的原型就是Array.prototype,它里面存在着一些数组的方法和属性,例如常见的push,pop等方法。

Function:Function也是一个函数对象,但它有点特殊,它的原型就是一个function空函数。

自定义函数:它的原型就是你给它指定的那个东西。如果你不指定,那它的原型就是一个Object.prototype。

无论什么时候以什么方式创建一个函数(函数对象),都会根据特定的规则为该函数创建一个prototype属性(原型对象的地址的引用),这个属性就是指向该函数的原型对象。

原型链:

在JavaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向),组成这条链的最后一环。这种一级一级的链结构就称为原型链(prototype chain)

调用一个实例本身和原型对象都没有的方法,其过程是:

代码:obj1.sayAge() // 实列本身和原型对象上都不存在的方法
分析:1.首先搜索obj1这个对象,并没有sayAge方法
2.继续向原型对象搜索(通过内部的 [[Prototype]]指针),没有找到 sayAge方法  
3.继续向原型对象的原型对象上搜索,即 obj1.__proto__.__proto__。也没有找到 sayAge方法。 
4.继续向原型对象的原型对象的原型对象上搜索,即 obj1.__proto__.__proto__.__proto__,但发现 obj1.__proto__.__proto__.__proto__为 null,停止搜索,抛出错误或返回 undefined
 
 
参考:博客、知乎

posted on 2022-02-27 11:56  H,01  阅读(45)  评论(0)    收藏  举报