标题中,__proto__
的__
是由两个_
组成的
共有属性(原型)
这个概念就是,一段代码有诸多个对象,对象有很多的属性、方法,把这么多个对象相同的属性、方法提取出来,弄在一个新对象里,大家一起用。对象里就只要存储新对象的地址,到时候要用到这些属性、方法了,再调出来使用。
看下图,简易内存图。左边原始代码区里声明了新对象O1,var O1=new Object()
,右边Heap里存储(从左往右看第一个箭头的右边都是Heap,没有Stack)。左边原始代码区里又声明了新对象O2,var O2=new Object()
,右边Heap里存储。作为一个对象,有些方法是都有的,比如toString()
,valueOf
等,所以提取出来,放在共有属性的Heap里,地址随机为A100,那么O1,O2的Heap里就存放共有属性的地址__proto__:A100
。你写代码O1.toString()
,就顺着上面的箭头找到O1的Heap,找一遍没有,又找到__proto__
里好像有东西,就找到了共有属性的Heap,里面有toString()
方法。
__proto__
和 prototype
的区别
个人理解,__proto__
是个地址,用于指向另一个对象,比如某个共有方法库。prototype
就是本个对象所有方法的集合。
var a=new Number(1);
a.__proto__ //这个就指向了Number类型的共有方法库
a.__proto__.prototype //这个就表示Number类型的共有方法库里所有的方法
简单类型和对象
诸如像下面代码所示,就是简单类型的简单声明。这样子声明的变量只包含简单类型值,没有别的像toString()
,valueOf
,toFixed
......等等的方法
var a=1;
var b="abc";
var c=true;
诸如像下面代码所示,就是简单类型的对象声明。这样子声明的变量除了包含简单类型值,还自带了一些类型专属方法和对象方法等等的方法
var a=new Number(1);
var b=new String("abc");
var c=new Boolean(true);
类型专属方法和对象方法就是上面讲的共有属性(原型)。这就好像,所有的Number类型有自己的方法库,所有的String类型有自己的方法库,所有的Boolean类型有自己的方法库,这些都是对象,所以最后所有Object类型有一个最最通用的方法库。画成图如下图。
- S1,S2 → String类型 → 自己的Heap → String类型方法库 → Object方法库
- n1,n2 → Number类型 → 自己的Heap → Number类型方法库 → Object方法库
- b1,b2 → Boolean类型 → 自己的Heap → Boolean类型方法库 → Object方法库
- o1,o2 → Object类型 → 自己的Heap → Object方法库
简单声明和对象声明的区别
讲道理,用起来没啥区别,方法该调用的调用,属性该有的都一样有。但实际上,是JavaScript自己做了处理的,方便了开发人员。
- 你先用简单声明声明一个简单类型
var n=1
- 简单类型缺点是,它就是一个值,啥也没有,想对它进行各种操作,不行
- 怎么办!这样也太傻太没用了吧!!那,临时转换下吧~~~
-
临时转换:
- 当你写下这样的代码
var b=n.toString();
- 建立临时变量
temp
,var temp=new Number(n)
- 这样就可以调用
temp
的toString()
方法了,temp.toString()
- 当你写下这样的代码
- 好了,临时转换好了,正确返回了
n.toString()
- 最后删除临时变量
temp
,结束,temp
来了、做了、走了
再来看看内存图
- 左边原始代码区,简单声明变量
var n=1;
,中间Stack里存储n的值 - 调用方法
n.toString()
,Stack里建立新变量temp
,这是个对象,所以Heap里存储temp
的所有内容,Stack里存储Heap地址ADDR 6
- 这样
n.toString()
,就等于temp.toString()
- 返回
temp.toString()
后,temp
就被磨灭了,Heap里的内容也随之消失
Number类型
-
两种声明方式
var a=1; var b=new Number(1);
-
Number类型专属方法
- 声明了一个变量,输出变量后看到,里面就只有一个东西
__proto__
,这是个地址,指向Number类型公用的方法库
- 点开
__proto__
,看到的就是Number类型共用的方法库
- 里边看到还有个
__proto__
,因为Number类型也是对象呀,所以这个__proto__
指向Object类型公用的方法库。点开这个__proto__
,就看到了Object类型公用的方法库
- 声明了一个变量,输出变量后看到,里面就只有一个东西
-
Number类型常用方法
toString() toFixed() toExponential() valueOf()
charCodeAt(0)
toString(16)
String类型
-
两种声明方式
var a="abc"; var b=new String("abc");
-
String类型专属方法
- 声明了一个变量,输出变量后看到,里面除了这个String对象的信息,还有一个东西
__proto__
,这是个地址,指向String类型公用的方法库
- 点开
__proto__
,看到的就是String类型共用的方法库。
。
。 - 里边看到还有个
__proto__
,因为String类型也是对象呀,所以这个__proto__
指向Object类型公用的方法库。点开这个__proto__
,就看到了Object类型公用的方法库
- 声明了一个变量,输出变量后看到,里面除了这个String对象的信息,还有一个东西
-
String类型常用方法
trim() concat() slice()
Boolean类型
-
两种声明方式
var a=true; var b=new Boolean(true);
-
Boolean类型专属方法
- 声明了一个变量,输出变量后看到,里面就只有一个东西
__proto__
,这是个地址,指向Boolean类型公用的方法库
- 点开
__proto__
,看到的就是Boolean类型共用的方法库
- 里边看到还有个
__proto__
,因为Boolean类型也是对象呀,所以这个__proto__
指向Object类型公用的方法库。点开这个__proto__
,就看到了Object类型公用的方法库
- 声明了一个变量,输出变量后看到,里面就只有一个东西
Boolean类型常用方法
Object类型
-
两种声明方式
var a={name:1}; var b=new Object({name:1});
-
Object类型专属方法
- 声明了一个变量,输出变量后看到,里面对象a基本信息,还有一个东西
__proto__
,这是个地址,指向Object类型公用的方法库
- 点开
__proto__
,a本身就是对象没有别的类型,所以看到的就是Object类型共用的方法库
- 声明了一个变量,输出变量后看到,里面对象a基本信息,还有一个东西
-
Object类型常用方法
toString() valueOf()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。