宝哥软件园

深入分析JavaScript中原型和原型的关系

编辑:宝哥软件园 来源:互联网 时间:2021-09-22

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

让我们分享一个函数、对象、原型和原型的内存图。

更多资讯
游戏推荐
更多+