三、图解JavaScript原型和原型链

一、全局对象window(浏览器内置的的,是一个hash)(global)

这里写图片描述
全局对象window有两大类全局属性.ECMAScript规定的全局属性和浏览器私有的全局属性。
这里写图片描述
调用window属性时,window可以省略。

二、全局函数

三个原始值及他们对应的包装对象
number、string、Boolean ——>new Number new String() new Boolean()

1.ECMAScript规定的属性全局函数

1.number()有两个作用:

1.将其他类型的值转换成数值 number("12356")==12356;
2.声明包装一个number对象var a=new number(1);->{valueof:1}
     var n1=1;
     var n2=new number(1);
n2.valueof可以获取到n2的原始值

这里写图片描述
上图就可以解释为什么要包装成对象:包装对象的最大目的,首先是使得 JavaScript 的对象涵盖所有的值,其次使得原始类型的值可以方便地调用某些方法。
包装成对象之后有很多便捷的方法,只是一个基本类型的值是没有方法的。
包装成对象之后可以向该对象添加属相和方法。valueof获取原始值.
!!!!这里要注意,对于基本类型的值,对基本类型使用toString()时会产生一个临时的包装对象,使用后立即销毁。
过程示意:
var n=1;n.toString();—–>var temp=new number(1); temp.toString();

这里写图片描述

var a=0; a.xx=9;(赋值之后,产生的临时的对象被销毁了)
a.xx===undefined;

原始类型的值在调用方法时,都会产生一个临时的对象,用完机会销毁。

2.string

同number一样,
var a =”qweer”和var a =new String(‘qweer ‘)的规律和number相同。
这里写图片描述
a.charAt(index);获取索引对应的字符
a.charCodeAt(index)获取索引对应的字符的ASCII码
“ dad “.trim()—>”dad” 删除空格
str1.concat(str2)连接两个字符串新的字符串。
str1.slice(strat,end)截取字符串( ]左开有闭。

3.boolean

var a=true;
var a =new Boolean(true);\

三.公用的属性藏在哪里

1.原型

原型===共有属性
- 有的属性和方法,是大家都有的,单独存储过于浪费内存,所以js就把这些属性放在一个公共对象里(原型)
- 每个对象都有一个proto属性,proto指向了公共对象里(共有属性)(原型)。
由此可知:所有同一类对象的toString()都是同一个原型,o1.toString===o2.toString();
- 继续深入我们可以发现
var a=new Number();var b= new Object();a.toString()!==b.toString()(这些都是包装对象)
原因如下图:
这里写图片描述
number包装对象所共有的属性是放在number对象的原型里,object对象的共有属性放在他自己的原型里。
这里写图片描述
a的proto里面还有一个proto第二个proto指向的是所有对象的原型(Object.prototype),不分种类。如下图所示:
这里写图片描述

2.原型链

其中的每一条从开始到object的线,就叫做原型链。
这里写图片描述

var a=new number(11);
原型存放在Object.prototype中。
Number.prototype===a.__proto__
Number.prototype.__proto__===Object.prototype
String.prototype
Boolean.prototype
Array.prototype

这里写图片描述

四.proto和prototype的区别

1.都是对公用属性(原型)的引用
2.proto是声明对象时创造的,而prototype则是浏览器默认就有的为了防止共有属性(原型)被垃圾回收而创造的。
如下图:

Object.__proto__ === Function.prototype

这里写图片描述
这里写图片描述
这里写图片描述

上面的总结起来可以用公式:
对象.proto===函数.prototype
既:
Objecet.proto===Function.prototype
在废话一点:
对于string.number.boolean函数创建的实例:
比如:new Number().proto.proto===Object.prototype;
包装对象的.proto.proto===(Object)对象的.proto===Object.prototype;

猜你喜欢

转载自blog.csdn.net/wang_liuyong/article/details/81275332