面试笔记

164 阅读2分钟

原型链知识

学习链接 github.com/mqyqingfeng…

原型

函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型

image.png

proto

  • proto 和 constructor
每个对象都有一个_proto_属性,它指向该对象的原型

image.png

  • constructor
每个原型都有一个 constructor 属性指向关联的构造函数

image.png

原型链

每个对象都有一个__proto__属性指向原型对象,同样原型对象也拥有__proto__属性指向它的原型对象,直至指向null,我们称此过程为原型链

image.png

代码理解

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

加上函数的原型链

image.png

类型推断

学习链接 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]
......

总结

1typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型。
2、如果想要判断一个对象的具体类型可以考虑用 instanceof,但是 instanceof 也可能判断不准确,比如一个数组,他可以被 instanceof 判断为 Object3Object.prototype.toString 可以判别变量类型