详解javascript中的__proto__和prototype

本文详细介绍了JavaScript中的五种基本数据类型及其构造函数,深入探讨了对象的__proto__属性如何链接形成原型链,解释了instanceof运算符的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在JS中,数据(或者说对象)有5种类型,number,string,boolean,function和object。我理解为只有这5种,像Date,Array等,并不是一种数据类型,从 typeof new Date()可以看到,这是object类型,其他的也一样。null和undefined是两个特殊的值,也不是一种数据类型。任何一种类型的对象(也就是数据,此处说对象更合适),都有一个属性__proto__(原型),这个属性是用来指出,该对象的额外的属性和方法(非自定义的)是从谁身上继承过来的,是一个object类型,指向对象的构造函数(Constructor)的prototype。每一种类型的对象都有一个对应的构造函数,分别是Number,String,Boolean,Function,Object。举个例子:
var num = 123;num 是number类型,那么,num.__proto__ === Number.prototype,表示num从Number.prototype继承了一些属性和方法。prototype又是什么东西呢?
prototype是function类型的对象所特有的一个属性,表示以该构造函数(就是一个普通的function对象,只是调用方式不一样)来构造对象时,新构造出来的对象从谁身上继承属性和方法。每个构造函数的prototype,都是用该构造函数构造出来的一个对象,是一个object。(注意:构造函数构造出来的对象都是object,而不是构造函数所对应的类型,有一个例外,Function构造出来的类型是function,不是object)。
构造函数本身,就是一个function对象,所以Constructor.__proto__ === Function.prototype。Function也是一个构造函数,所以Function.__proto__ === Function.prototype。
从上面的叙述可以看出,obj.__proto__ === Object.prototype,而Object.prototype也是一个对象,也有__proto__属性,由此形成了原型链obj.__proto__.__proto__...。而Object.prototype.__proto__ === null,所以,原型链的根就是Object.prototype。
instanceof 就是根据原型链来判断的,if(obj.__proto__.__proto__... == Constructor.prototype) obj instanceof Constructor === true

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值