JavaScript共有属性(原型)(prototype/__proto__)

标题中,__proto____是由两个_组成的

共有属性(原型)

这个概念就是,一段代码有诸多个对象,对象有很多的属性、方法,把这么多个对象相同的属性、方法提取出来,弄在一个新对象里,大家一起用。对象里就只要存储新对象的地址,到时候要用到这些属性、方法了,再调出来使用。

看下图,简易内存图。左边原始代码区里声明了新对象O1,var O1=new Object(),右边Heap里存储(从左往右看第一个箭头的右边都是Heap,没有Stack)。左边原始代码区里又声明了新对象O2,var O2=new Object(),右边Heap里存储。作为一个对象,有些方法是都有的,比如toString(),valueOf等,所以提取出来,放在共有属性的Heap里,地址随机为A100,那么O1O2的Heap里就存放共有属性的地址__proto__:A100。你写代码O1.toString(),就顺着上面的箭头找到O1的Heap,找一遍没有,又找到__proto__里好像有东西,就找到了共有属性的Heap,里面有toString()方法。
共有属性_1

__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();
    • 建立临时变量tempvar temp=new Number(n)
    • 这样就可以调用temptoString()方法了,temp.toString()
  • 好了,临时转换好了,正确返回了n.toString()
  • 最后删除临时变量temp,结束,temp来了、做了、走了

1和new_number(1)_1

再来看看内存图

  • 左边原始代码区,简单声明变量var n=1;,中间Stack里存储n的值
  • 调用方法n.toString(),Stack里建立新变量temp,这是个对象,所以Heap里存储temp的所有内容,Stack里存储Heap地址ADDR 6
  • 这样n.toString(),就等于temp.toString()
  • 返回temp.toString()后,temp就被磨灭了,Heap里的内容也随之消失

1和new_number(1)_2

Number类型

  • 两种声明方式

    var a=1;
    var b=new Number(1);
  • Number类型专属方法

    • 声明了一个变量,输出变量后看到,里面就只有一个东西__proto__,这是个地址,指向Number类型公用的方法库
      number原型_1
    • 点开__proto__,看到的就是Number类型共用的方法库
      number原型_2
    • 里边看到还有个__proto__,因为Number类型也是对象呀,所以这个__proto__指向Object类型公用的方法库。点开这个__proto__,就看到了Object类型公用的方法库
      number原型_3
  • Number类型常用方法

    toString()
    toFixed()
    toExponential()
    valueOf()

charCodeAt(0)
toString(16)

String类型

  • 两种声明方式

    var a="abc";
    var b=new String("abc");
  • String类型专属方法

    • 声明了一个变量,输出变量后看到,里面除了这个String对象的信息,还有一个东西__proto__,这是个地址,指向String类型公用的方法库
      string原型_1
    • 点开__proto__,看到的就是String类型共用的方法库
      string原型_2_1




      string原型_2_2

    • 里边看到还有个__proto__,因为String类型也是对象呀,所以这个__proto__指向Object类型公用的方法库。点开这个__proto__,就看到了Object类型公用的方法库
      string原型_3
  • String类型常用方法

    trim()
    concat()
    slice()

Boolean类型

  • 两种声明方式

    var a=true;
    var b=new Boolean(true);
  • Boolean类型专属方法

    • 声明了一个变量,输出变量后看到,里面就只有一个东西__proto__,这是个地址,指向Boolean类型公用的方法库
      boolean原型_1
    • 点开__proto__,看到的就是Boolean类型共用的方法库
      boolean原型_2
    • 里边看到还有个__proto__,因为Boolean类型也是对象呀,所以这个__proto__指向Object类型公用的方法库。点开这个__proto__,就看到了Object类型公用的方法库
      boolean原型_3
  • Boolean类型常用方法

Object类型

  • 两种声明方式

    var a={name:1};
    var b=new Object({name:1});
  • Object类型专属方法

    • 声明了一个变量,输出变量后看到,里面对象a基本信息,还有一个东西__proto__,这是个地址,指向Object类型公用的方法库
      object原型_1
    • 点开__proto__,a本身就是对象没有别的类型,所以看到的就是Object类型共用的方法库
      object原型_2
  • Object类型常用方法

    toString()
    valueOf()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值