美文网首页
原型与原型链

原型与原型链

作者: 陈夏天0527 | 来源:发表于2019-02-12 23:34 被阅读0次

    一、全局对象

    ECMAScript把全局对象成为global,但浏览器里全局对象成为window

    全局对象分为两种:

    1.ECMAScript规定好的,如:global.parseInt、global.parseFloat、global.Number、global.String、global.Boolean、global.Object

    2.浏览器私有的,如:window.alert、window.prompt、window.confirm、window.console.log、window.document

    所有API都可以在MDN找到相关资料。

    二、全局函数(简单类型与对象的区别:内存不同)

    1.Number

    n和m都是声明数字1,但打印出来的结果不一样

    上图n、m都是声明了数字1,但第一个方法可以看到n只打印出1,而方法二打印出一个对象,该对象里除了一个名为[[PrimitiveValue]]: 1的东西,还有一个_proto_(下文再说明_proto_是什么)

    结合上一篇《JS里的数据类型转换》中内存图的只是,我们可以知道普通类型在声明的时候是把数据放到Stack(栈内存)中,他们并没有任何key(key是对象才有)。那么为何我们在转换类型的时候可以直接写x.toString()呢(如图二)?

    图二

    这是因为当写这句语句时浏览器把该声明语句作了临时的改变,转换成图三的类型。可以看到图三中对象Number{1}中的_proto_里有一个toString的key。这就是为什么我们可以直接写x.toString

    图三

    2.String

    与Number一致

    3.Boolean

    留意下图:

    a什么也没打印,但b能打印出来。这是因为b声明了一个对象,而对象的布尔值为true

    4. var o = {} 与var o = new Object()没有区别

    三、公用属性(原型)

    所有对象都有 toString 和 valueOf 属性,所以没有必要给每一个对象一个toString 和 valueOf 属性。JS的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象),然后让每一个对象的 __proto__ 存储这个公用属性组成的对象的地址。解释如下图:O1和O2中都有一个名为_proto_的对象,他们都指向同一个属性。

    四、重要公式

    var 对象 = new 函数()

    对象.__proto__ === 对象的构造函数.prototype

    如何理解_proto_与prototype的区别呢?(简单来说,prototype是没有任何代码时浏览器已经准备好的,_proto_是写了代码以后出现的,他们都指向同一个地方)

    相关文章

      网友评论

          本文标题:原型与原型链

          本文链接:https://www.haomeiwen.com/subject/woyleqtx.html