typeof

typeof操作符返回一个字符串,表示未经计算的操作数的类型
image.png

  1. typeof null === 'object'; // 从一开始出现JavaScript就是这样的

在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了”object"
注意使用 new 操作符创建的变量,例如:

  1. var str = new String('hello');
  2. typeof str; // 'object'

instanceof

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例。
语法:

  1. object instanceof constructor

参数:
object 要检测的对象
constructor 某个构造函数
instanceof运算符用来检测 constructor.prototype是否存在于参数 object 的原型链上
由于instanceof检查整个原型链,因此同一个实例对象,可能会对多个构造函数都返回true

Object.getPrototypeOf

**Object.getPrototypeOf()** 方法返回指定对象的原型(内部[[Prototype]]属性的值)
语法:

  1. Object.getPrototypeOf(object)

参数:
obj 要返回其原型的对象。
返回值:
给定对象的原型。如果没有继承属性,则返回 null
image.png

prototype

JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享。也就是说,如果属性和方法定义在原型上,那么所有实例对象就能共享,不仅节省了内存,还体现了实例对象之间的联系。
JavaScript 规定,**每个 函数 都有一个 prototype 属性指向一个对象。**

  1. function f() {}
  2. typeof f.prototype // "object"

对于普通函数来说,该属性基本无用。但是,**对于构造函数来说,生成实例的时候,该属性会自动成为实例对象的原型。
image.png
A对象的原型不是A的属性,而是A的构造函数的属性**
image.png