Prototype,每个函数对象都有一个显示的prototype属性,它代表对象的原型(Function.prototype函数对象是一个例外,没有prototype属性)。
__proto__:每个对象都有一个名为__proto__的内部隐藏属性,该属性指向其对应的原型对象(在chrome和firefox中名为__proto__且可以访问)。原型链是基于__proto__形成的。
(注意:不是基于函数对象的属性原型)。
简单来说:__proto__是内部原型,prototype是构造器原型(构造器实际上是一个函数)。
构造函数的原型是一个对象。
什么是构造函数?
如果你想创建一个对象,你必须首先有一个对象构造器,就像在php中一样。如果你想创建一个对象,你必须首先有一个类构造器,它的本质是一个函数。下面的问题是:如何通过这个构造函数创建一个对象?
回答:新的。
构造函数构造一个对象。
1.所有构造函数/函数的__proto__指向Function.prototype,它是一个空函数。
号码。_ _ proto _ _===function . prototype//TrueBoolean。_ _ proto _ _===function . prototype//TrueString。_ _ proto _ _===function . prototype//TrueObject。_ _ proto _ _===function . prototype//TrueFuncTion。_ _ proto _ _===function . prototype//TrueArray。_ _ proto _ _===function . prototype//TrueRegExp。_ _ proto _ _===function . prototype//TrueError。_ _ proto _ _===function . prototype//TrueDate。_ _ proto _ _===function . prototype//true
说明Number等是构造函数,这些构造函数实际上是Function的一个对象。这相当于var Number=new Function();
JavaScript中有12个内置的构造函数/对象(JSON是ES5中新加入的)。这里有8个可访问的构造函数。如果不能直接访问Global,则只在调用函数时由JS引擎创建参数,Math和JSON作为对象存在,没有新的。他们的原型是对象。原型如下
数学。_ _ proto _ _===object . prototype//trueJSON。_ _ proto _ _===object . prototype//true
上面提到的“所有构造函数/函数”当然包括自定义。如下
//函数声明函数Person(){}//函数表达式varman=function(){ } console . log(Person。_ _ proto _ _==函数。原型)//trueconsole.log (man。_ _ proto _ _==函数。原型)//。
这是什么意思?
的所有构造函数都来自Function.prototype,甚至包括根构造函数Object和Function本身。所有的构造函数都继承了Function.prototype的属性和方法,例如长度、调用、应用、绑定(ES5)。
函数原型也是唯一一个类型为“函数”的原型。的其他构造函数的原型是一个对象。如下
console . log(type of function . prototype)//function console . log(type of object . prototype)//object console . log(type of number . prototype)//object console . log(type of boolean . prototype)//object console . log(type of array . prototype)//object console . log(type of regexp . prototype)//object console . log(type of error . prototype)//object console . log(type of date . prototype)//object console . log(type of object . prototype)//object
哦,上面也提到了是空函数。在警告下看一看(函数.原型)。
知道所有构造函数(包括内置和自定义)的__proto__都是Function.prototype,那么Function.prototype的__proto__是谁呢?
我相信我听说过JavaScript中的函数也是一等公民,那么在哪里可以体现呢?如下
console . log(function . prototype . _ _ proto _ _===object . prototype)//true
这说明所有的构造函数也是普通的JS对象,可以给构造函数添加/删除属性。同时,它继承了Object.prototype上的所有方法:toString、valueOf、hasOwnProperty等。
谁是对象原型的最后一个原型?
object . prototype . _ _ proto _ _===null//true
让我们分享一个函数、对象、原型和原型的内存图。