简单来说,就是js世界初始为null
然后上帝发明了一个No.1 模板,根据模板创造了Object这个机器,让Object来new对象。
上帝觉得应该分类创建对象,于是就有了Array,Number,Boolean,String等机器来制造不同的对象
虽然机器是用来制造对象的,但是机器本身实际上也是一种特殊对象啊。现在有了这么多机器,我得好好总结一下它们的共同特征,把它们也纳入对象体系。 造物主基于 No.1 模板,造出了一个 No.2模板 ,用它来表示所有机器的共同特征。换句话说,把它作为所有机器的原型对象。
上帝觉得应该有个机器来制造机器,于是就有了Function这个制造机器的机器。
而这个模板继承,就是__proto__ / prototype。
这些机器,就是构造函数
于是乎js世界就变成了这样:
对象构造:
- 对象.
_proto_=== 其构造函数.prototype - 其构造函数.prototype.
__proto__=== Object.prototype - 对象.
_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__串连起来的