全面解析Function,Object,Constructor及其实例间的关系。

131 阅读2分钟
function fn () {}
const A = {}
const B = new fn()
  1. 先问一个问题,对象A和对象B一样吗?
B.__proto__ === A.__proto__ // false
B.constructor === A.constructor  // false

他们的原型和构造器都不一样, 那他们之间存在什么关系呢?答案是:

B.__proto__ === A.__proto__ // false
B.__proto__.__proto__ === A.__proto__ // true

如果看到这里,相信你已经学会如何在Es5之前实习类的继承了:只需让其实例对象的构造器原型的__proto__属性指向其父类原型而不是Object的原型即可.

在 JavaScript 中,几乎所有的对象都是 Object 类型的实例,它们都会从 Object.prototype 继承属性和方法。 但是他们和Object之间到底是什么关系?

  1. function(){}和()=>{}之间的关系?
function F(){}
const A = () => {}
F.constructor === A.constructor // true
F.__proto__ === A.__proto__ // true
A.prototype // undefined
F.prototype // f () {}

这是符合我们认知的,匿名函数没有prototype属性。

每个 JavaScript 函数实际上都是一个 Function 对象。运行 

(function(){}).constructor === Function // true

便可以得到这个结论。

  1. Function和Object之间有关系吗?是什么样的关系呢?
Function.prototype.__proto__.constructor === Object // true
Object.__proto__.constructor === Function // true
  1. Function 与 A = ()=>{},function F(){}之间的关系?
// 上面提到了
F.constructor === A.constructor // true
F.__proto__ === A.__proto__ // true
// 他们的构造器就是Function
F.constructor === Function // true
// 他们的__proto__的构造器也是Function
F.__proto__.constructor === Function // true
  1. 怎么记住这张图? JS六种对象之间的3个关系.png

事实上他们存在一定的规律

横向来看:

function fn(){}
const instance = new fn()

// Function和()=>{}之间
Function.prototype === (()=>{}).__proto__ // 规律1
Function === (()=>{}).constructor // 规律2

// function fn(){}和new fn()之间
fn.prototype === instance.__proto__ // 规律1
fn === instance.constructor // 规律2

// Object和{}之间
Object和.prototype === ({}).__proto__ // 规律1
Object和 === ({}).constructor // 规律2

纵向来看:

//  constructor 的关系
Function.constructor === Function
Fn.constructor === Function
Object.constructor === Function

//  __proto__ 的关系
Function.__proto__ === Fn.__proto__
Fn.__proto__ === Object.__proto__

//  prototype 的关系
///趋向Object
Function.prototype.__proto__ === Object.prototype
fn.prototype.__proto__ === Object.prototype
/// 仅Function,function,Object存在prototype属性,并且他们的prototype的constructor都等于他们本身
Function.prototype.constructor === Function
fn.prototype.constructor === fn
Object.prototype.constructor === Object

趋势看:

读取对象的 constructor 向 Function 靠拢。

读取对象的__proto__ 向 null 靠拢。

读取对象的 prototype 向 undefined 靠拢。

其余的自求多福吧。希望这不是八股文~(目前还没有看到那么变态的)

给看到最后的朋友献上一份更简单的图例:

移除无用undefined线.png