prototype与__proto__的联系与区别

本文旨在清晰地解释JavaScript中的prototype与__proto__。JavaScript没有类的概念,一切皆为对象,对象分为原始类型和引用类型。Function与Object是平级的,Function拥有更强的能力,如可执行和作为构造函数。JavaScript的继承基于原型链,对象的__proto__属性指向其原型对象,而prototype属性主要在Function中用于构造函数时构建对象的原型。当使用new操作符时,Foo函数被执行,foo.__proto__指向Foo.prototype,实现继承。__proto__非标准但已被广泛使用,简化了原型链的操作。

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

写在前面

这篇文章我的目的是试图讲清楚prototype与__proto__。很多人也许和我一样,很困扰于这两个东西究竟是干啥的,网上的各种资料也是讲的云里雾里,傻傻分不清楚。今天我就来尝试把它们说清楚。

JavaScript里没有类的概念

首先必须明确这一点,如果你学过Java之类的面向对象语言,你肯定熟悉类的概念,在面向对象语言的逻辑里,我们要先设计类(Class),然后再把类实例化成对象(Object),就像是图纸和产品的关系,我们必须先设计“图纸”,然后才能打造“产品”。

而在JavaScript里,根本没有类的概念,它的所有东西都是对象,其实,这并没有什么问题,不是所有语言都必须像Java一样必须依赖类这个概念设计,比如C语言里也没有类的概念,一样活得很好。不过,我们必须承认,类的思想会给工程问题带来很多方便,所以,在JavaScript的不断发展中,一些需求也催生了JavaScript想模仿类这个概念。比如说,如果你想构建一个有一定规模的项目,那你必然会涉及到一些继承问题,而这种继承问题,在Java中就是用类来解决的,那在JavaScript中,我们该怎么办?当然有办法,那就是模仿,我们没有类,但我们可以模仿类,而且随着时代的发展,我们有了更好的方法。prototype与__proto__都是在这个过程中催生的产物,我们一会儿马上讨论,在这之前,我们先明确一下类型(type)的概念。

我们没有类(Class),但我们有类型(Type)

上面说过,JavaScript没有类的概念,它里面的所有东西都是对象,但他的对象是有类型的,英文是type。

关于类型的总结,基本上每本教科书上都会列举的很清楚,分两种,原始类型(Primitive Types)与引用类型(Reference Types)。

原始类型(5种):Boolean、Number、String、Null、Underfined

引用类型(6种):Array、Date、Error、Function、Object、RegExp (其实也不止这些)

在javascript中,可以用typeof操作符判断一个变量的类型,关于typeof也要说明一点,5中原始类型都可以用它判断出来(除了Null,Null类型返回object),但对于引用类型,只有两种返回值:function和object,这也就说明了一点,其实引用类型根本上只有两种,那就是Function和Object,其他的引用类型都是Object衍生出来的(它们都返回Object),下面代码可以验证:

//代码1
var boo = true;
var num = 123;
var str = "hello world!"
var nu = null;
var und;
var fun = new Function();
var arr = new Array();
var dat = new Date();
var err = new Error();
var obj = new 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值