原型链
js 中的援用数据类型能够分为以下两种
- 援用类型实例
- 构造函数(类)
一个援用类型站在不同的角度,会有不同的身份,
// 1. Obj 是一个办法 ,能够独自调用执行(当作为函数调用时也是 Function 的实例)// 2. Obj 是一个构造函数,能够实例化一个对象let Obj = function(){}
- 作为构造函数身份时,该构造函数会有一个
prototype
属性,该属性能够称之为显式原型;当作为实例时,该数据存在一个__proto__
属性,该属性能够称之为隐式原型,__proto__
能够通过Object.getPrototypeOf()
办法取得。因为有的数据,如上代码所示,既能够作为实例,又能够作为构造函数,所以,该数据能够同时存在显式原型与隐式原型。更确切的说,函数能够同时有这两个属性。(简而言之, prototype 是用于类的,而 Object.getPrototypeOf() 是用于实例的(instances),两者性能统一。[1]) 原型链是指数据的隐式原型组成的援用关系。留神不是显式原型
let Obj = function(){}// 当A 的隐式原型 === B的显式原型,A 就是B的(子类)实例Obj.__proto__ === Function.prototypeObj.__proto__.__proto__ === Object.prototype// Obj.__proto__.__proto__ 能够叫做原型链// 原型链的顶端是 null 即 Object.prototype.__proto__ === null
A instanceof B
通过要查找原型链来确定A是否是B的实例。
实现
通过查找child 的隐式原型链,来确认是否存在援用是parent的显式原型。
function instanceOf(child, parent){// 这里应该有根本数据类型的过滤// 偷个懒if(child === null || parent === null) return falseconst left = child.__proto__const right = parent.prototypeif(left === right) return truereturn instanceOf(left,parent)}const r1 = instanceOf(1, Number)console.log(r1)
[1] https://developer.mozilla.org...