## JavaScript中原型的理解
- 原型,实例,构造函数之间的关系。
- 原型:每一个JavaScript对象对创建出来都会伴随一个原型 (proto),!!!注意:null除外,null没有原型。
-
每一个对象通过prototype属性进行链式继承。
- 实例:实例是通过new创建出来的 。
- 构造函数:通过new创建一个对象的函数 。
*举一个简单的例子
let obj = new Object()
obj 是Object 的实例,Object 是obj 的构造函数
new 关键字用来在内存中开辟空间
obj.__proto__ === Object.prototype
综上所描述,可以得到三者的关系
- 实例.proto === 原型
- 原型.cunstructor === 构造函数
- 构造函数.prototype === 原型
手动实现instanceof:实现思路:构造函数的原型 === 实例的原型 则说明 该实例属于该构造函数的一个实例对象
function instance_of(L, R) { // L 是为实例 R 是构造函数 Array Object Nubmer
// 验证如果为基本数据类型,就直接返回false
const baseType = ['string', 'number', 'boolean', 'undefined', 'symbol']
if (baseType.includes(typeof L)) { return false } // 隐士转换讲数组转换成字符串,数组本身是不具有includes方法的
if (R===null) return false //null没有prototype属性
let RP = R.prototype; //取 R 的显示原型
L = L.__proto__; //取 L 的隐式原型
while (true) {
if (L === null) {
return false;
}
if (L === RP) {
return true;
}
L = L.__proto__; //没找到继续向上一层原型链查找
}
}
console.log(instance_of([1,2,5,5,8,5], Array)) //true
//证明隐式转换
const baseType = ['string', 'number', 'boolean', 'undefined', 'symbol']
console.log(baseType+'qq') //string,number,boolean,undefined,symbolqq