js原型与原型链

76 阅读2分钟

简单来说,就是js世界初始为null

然后上帝发明了一个No.1 模板,根据模板创造了Object这个机器,让Object来new对象

上帝觉得应该分类创建对象,于是就有了Array,Number,Boolean,String等机器来制造不同的对象

虽然机器是用来制造对象的,但是机器本身实际上也是一种特殊对象啊。现在有了这么多机器,我得好好总结一下它们的共同特征,把它们也纳入对象体系。 造物主基于 No.1 模板,造出了一个 No.2模板 ,用它来表示所有机器的共同特征。换句话说,把它作为所有机器的原型对象。

上帝觉得应该有个机器来制造机器,于是就有了Function这个制造机器的机器

而这个模板继承,就是__proto__ / prototype。

这些机器,就是构造函数

于是乎js世界就变成了这样: uTools_1684041893412.png

对象构造:

  1. 对象._proto_ === 其构造函数.prototype
  2. 其构造函数.prototype.__proto__ === Object.prototype
  3. 对象._proto_._proto_._proto_... === null

Object.prototype是所有对象(包括由Object构造函数创建的对象以及其他自定义对象)的原型链的顶端。Function作为一个函数对象,其原型链最终也会追溯到Object.prototype

函数构造:

函数有两种构造方式,即函数声明、函数表达式或者使用 Function 构造函数来创建。

// 函数声明
function myFunction() {}

// 函数表达式
const anotherFunction = function() {};

// 使用 Function 构造函数
const yetAnotherFunction = new Function('arg1', 'arg2', 'return arg1 + arg2');

一般使用前两种方式居多。而 Function 构造函数创建函数的方式比较少用,因为它的性能相对较差且代码可读性不好。

Function构造函数本身也是一个函数对象,它的 __proto__ 指向 Function.prototype,因为所有的函数都是由 Function 构造函数创建的。同时,Object 构造函数也是一个函数,它的 __proto__ 指向 Function.prototype

即:Function.__proto__=== Function.prototype

Function.prototype本身也是一个对象,它最后指向Object.prototype

即:Function.prototype.__proto__ === Object.prototype

总结:

原型及原型链是用来存放并串联js对象的共有属性的。一个实例化对象的__proto__指向其构造函数的Prototype,其构造函数的__proto__指向Object.prototype,Object.prototype的__proto__指向null。所以原型链是由__proto__串连起来的