美文网首页
JavaScript 原型与原型链

JavaScript 原型与原型链

作者: Qingelin | 来源:发表于2019-08-10 00:04 被阅读0次

    1、全局对象:

    以浏览器里面的window为例:

    JS语言中,在ECMAScript标准里面全局对象叫做global,而浏览器是先于ECMAScript发表出来的,在浏览器里面全局对象叫做window;

    window的属性:

    1、EMCAScript规定的,共有的(不管是浏览器还是node.js都有的)标准库函数:

    全局函数(对象):

      1、parseInt    

            功能:

      2、parseFloat  

            功能:

     3、Number()

            功能:

                1、能把其他类型的数转为数字。//用对象属性来操作的时候JS隐形地对它进行                                                        隐形地、临时的转为对象(temp),所以可以使用对象的属性来对                                              其进行操作,结束后临时的对象就消失了

                2、可以声明一个number对象

    Number() 创建临时对象

    4、string()

            功能:

                1、基本类型的String

                2、可以创建一个string对象的哈希 

    String

                         //创建的哈希表中有很多属性:

                            charAt(第几位)   //表示第几位的字符

                            charCodeAt(第几位)   //表示第几位的字符对应的Unicode编码(扩展:

                                    1、'a'.charCodeAt(0)  //a的10进制的Unicode码

                                    2、'a'.charCodeAt(0).toString(16)    //a的16进制的对应的Unicode码

                           )

                          trim      //去掉字符串两边多余的空格

                         concat     //连接两个字符串,举例:s1.concat(s2)

                        slice(0,3)    //切后留下第一个到第三字符

                       replace     //代替  举例:s-.replace('w','d')

    5、Boolean()

            功能:

    Boolean

               下面的例子只打印2.因为对象都是true,而false是falsy值:

    踩过的坑

    6、Object()

            功能:声明对象建议使用第一种声明方法。

    object

    obj1 === obj2  //false   原因:两者虽然在Heap堆内存中都是空的,但他们的Stack栈内存中地址不一样;

    【注】只要是Stack栈内存中的地址不一样都是严格不相等;推论:所有新声明的对象都是不相等,除非把一个对象的Stack栈内存中的地址赋值给另一个。

    7、异步函数:window.setTimeout()  //window.setTimeout(function(){},   3000) 指定时                                                                                   间后执行这个函数

            功能:     

    2、特定浏览器才有的(chrome /firefox等):                                                                                                                                      

    全局函数(对象):

            浏览器跟用户交互功能的四个函数:

                    alert   //弹框提示

                    prompt    //用户填东西

                    confirm   //用户确认

                    console.log   //开发者打印东西

                    document    //文档  ;这个全局函数有自己的规范DOM,而DOM这个规范是由                                                                w3C规定的

                    history    //BOM

              …………



    2、原型链

    原型与原型链:在这里我用全局函数公用属性来代替原型这个概念,每一个对象都有共同的属性:toString    和  valueOf 等属性,所以在内存中早先创建一个带有这两个属性的对象,每一个声明的对象都共同调用这个,这样不浪费内存。那么那么多创建的对象都怎么知道这个公用属性呢?因为每一个创建的对象Heap内存中都有隐藏的属性: __proto__,这个属性的值就是公用属性的值。因此我们可以知道,新声明的各属性之间不相等,也就是 obj1 === obj2  //false;  但是obj1.toString === obj2.toString //true;valueOf也相等……;

    (1)普通对象:调用一个属性,直接指向公用的属性里面去找。

    (2)其它类型的全局函数声明的对象:调用一个属性,首先看自己的Heap内存中有没有这个属性,如果有直接调用,如果没有就会再调用__proto__属性,指向所有对象公用的属性里面去找。(声明一点:为了不浪费内存,一种类型的数据对应的全局函数声明的对象都调用自己的__ proto__属性优先去调用这一类公用的属性,如果没有再调用这一类数据的公用属性里面的__proto__属性去调用公用的属性。即每一步都调用__proto__属性,去找下一个内存区。)

    不同对象的调用属性原理

    【注】__proto__ 是在写对象的时候才有的,引用的protoytpe的功能,它不被调用的话会被GC;而prototype是浏览器自带的,每一种方法声明的对象都有的、是浏览器提供的,一直都有,不会被GC.举例:String.prototype是String的公用属性的引用(防止被GC);s.__prototype__是引用String的共用属性的,是用户写的对象调用的。

    引用关系 引用关系+1

    对象—— 总结

    __proto__ && prototype

    3、数据类型总结:

    7中数据类型——number  string boolean symbol undefined null object(object/array/function)

    5个falsy值—— 0 NaN false  '' undefined null

    内存图——Stack   Heap      基本类型与复杂对象的区别

                                这三个倒背如流能解决80%的数据问题啦!!!

    相关文章

      网友评论

          本文标题:JavaScript 原型与原型链

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