对于第一次学习JS的人说,原型与原型链是两个绕不开的概念,这既是难点也是重点。下面我们来初步认识一下这两个概念,从如下几个方面谈起
前言
与大部分面向对象语言不同,JavaScript中并没有引入类(class)的概念,但JavaScript仍然大量地使用了对象,为了保证对象之间的联系,JavaScript引入了原型与原型链的概念。
1.全局对象
什么是全局对象,说通俗一点就是脚本在任意地方都可以调用的对象,在浏览器中即是Windows对象
这种对象可以分为两种,第一种是ECMAScript规定的例如parseInt 、 parseFloat,以及Number() 、Boolean() 、String() 、Object()
另外一种是浏览器自带的,在不同的浏览器中表现形式不一样alert() 、prompt() 、confirm() 、console() , document 、history
注意 1.window对象中例如 alert(),可以直接写作alert( ),也可以写作 window.alert()
2.简单类型与对象
声明一个数值类型的变量
两种方式,它们在内存中的存储方式是不同的,n1是直接声明简单的数据类型(number),存储在stack栈内存中,而n2是声明了一个对象stack内存中存储着该对象的内存地址,对象的内容存储在heap堆内存中。
但是在平常写代码的时候我们没有使用n2的写法,也可以使用valueOf() 方法 和toSting()方法。
原因是:JS使用妙计:临时转换(用完了就没了),如果你使用n1的写法,调用了了如valueOf方法,那么JS会创建一个临时的对象,然后调用该对象的方法,调用结束后临时对象就会被垃圾回收掉。
3.Numer对象
Number对象
Number|的常用属性含义
Number.valueOf() | 获取对象本身的值
Number.toString() | 将数值转化为字符串
Number.toFixed() | 将其转换为小数
Number.toExponential() 将其转化为科学计数法
4.原型与原型链
JavaScript中所有对象都有toString和valueOf属性,给每个对象一个toString和valueOf显然会造成极大的浪费。为此,JS的做法是将toString和valueOf放在一个对象里,然后让每一个对象的__proto__来存储这个公共属性的地址。这个公共属性就是原型(proto)
每一个构造函数都拥有一个prototype属性,这个属性指向一个对象,也就是原型对象。当使用这个构造函数创建实例的时候,prototype属性指向的原型对象就成为实例的原型对象。
原型对象默认拥有一个constructor属性,指向指向它的那个构造函数(也就是说构造函数和原型对象是互相指向的关系)。
每个对象都拥有一个隐藏的属性[[prototype]],指向它的原型对象,这个属性可以通过Object.getPrototypeOf(obj)或obj.__proto__来访问。
实际上,构造函数的prototype属性与它创建的对象的[[prototype]]属性指向的是同一个对象,即
对象.__proto__ === 函数.prototype。
原型链
JavaScript中所有的对象都有原型对象。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链(prototype chain)。
所有原型链的终点都是Object函数的prototype属性,因为在JavaScript中的对象都默认由Object()构造。Objec.prototype指向的原型对象同样拥有原型,不过它的原型是null,而null则没有原型。
参考:https://juejin.im/post/5a94c0de5188257a8929d837