原型链知识
原型
函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型
proto
- proto 和 constructor
每个对象都有一个_proto_属性,它指向该对象的原型
- constructor
每个原型都有一个 constructor 属性指向关联的构造函数
原型链
每个对象都有一个__proto__属性指向原型对象,同样原型对象也拥有__proto__属性指向它的原型对象,直至指向null,我们称此过程为原型链
代码理解
function Person() {}
// 往Person的原型上添加name
Person.prototype.name = 'Kevin';
var person = new Person();
// 往person对象上添加name
person.name = 'Daisy';
console.log(person.name) // Daisy
// 删除person实例上的name
delete person.name;
// 会到person._proto_去查找原型上是否有name属性
console.log(person.name) // Kevin
加上函数的原型链
类型推断
学习链接 juejin.cn/post/684490… typeof
- 了解底层存储变量
js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息
000 代表对象
010 代表浮点数
100 代表字符串
1 代表整数
null 所有机器码均为0
undefined 用 −2^30 整数来表示
typeof 在判别null时,会将null判断为对象类型,所以最好是用 typeof 来判断基本数据类型(包括symbol),避免对 null 的判断。
instanceof 判断一个实例是否属于某种类型(通过原型链去是否匹配该类型)
- 大概的思路
function new_instanceof(leftType, rightType){
// 找到rightType的原型
let rightValue = rightType.prototype;
// 找到leftType的原型,注:leftType的原型可能也有原型,所以需要遍历
let leftValue = leftType ? leftType.__proto__ : null;
while(true){
if(leftValue == null){
return false;
}
if(leftValue == rightValue){
return true;
}
leftValue = leftValue.__proto__;
}
}
new_instanceof(1, Number)
new_instanceof(1, String)
Object.prototype.toString
Object.prototype.toString.call([1, 2, 3]) // [Object Array]
Object.prototype.toString.call({sum:1}) // [Object Object]
......
总结
1、typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型。
2、如果想要判断一个对象的具体类型可以考虑用 instanceof,但是 instanceof 也可能判断不准确,比如一个数组,他可以被 instanceof 判断为 Object;
3、Object.prototype.toString 可以判别变量类型