美文网首页
JS原型的理解历程

JS原型的理解历程

作者: echo_me | 来源:发表于2017-03-30 11:29 被阅读21次

    1.JS中对象的从属关系

    JS必须在宿主环境中才能正常运行,而宿主环境一般都会为其提供一个全局对象。
    web浏览器为JS提供的全局对象是window,所以JS中一切的对象和变量都是window的属性。
    var a = 1; console.log( a ); //1 console.log(window.a); //1 console.log(this.a); //1

    ·构造函数和new

    还是上代码吧,千言不如一码。
    function a(){ this.name = 'echo'; //or name = 'echo'; } a(); console.log(name); // echo console.log(window.name);//echo
    构造函数里面的东东都是window对象下的属性。这下明白为什么在构造函数里定义的变量如果不用var const let的话,该变量就是全局变量了吧,很神奇吧,这还不算神奇,神奇的还在后面。

    让我们继续看吧。

    function a(){ this.name = 'echo'; } var aa = a(); console.log(aa.name); //报错 console.log(name); // echo console.log(typeof aa); // undefined

    function a(){ this.name = 'echo'; } var aa = new a(); console.log(aa.name); //echo console.log(name); // echo console.log(typeof aa); // object
    以上代码我们可以看出new操作符在里面没干好事,具体干了什么呢?解释一下:
    创建一个新对象 > 把构造函数里面的this指向该对象 > 执行函数,给该对象赋予属性和方法 > 返回对象

    ·构造器属性

    当我们创建对象的时候,同时赋予该对象一个属性constructor,该属性是个指向创建该对象构造函数的引用。

    function a(){ this.name = 'echo; } var b = new a(); console.log( b.constructor ); //function a(){ this.name = 'echo ' }

    当然如果你通过对象文本标识创建的,该属性指向的是构造函数object()函数
    `var o = {};
    console.log( o.construtor ); //object(){}

    原型和原型链

    说到这个就重在理解了。先上一张美美的图吧。

    QQ图片20170316143608.jpg

    简单说一下:你的父亲(函数对象)一出来就立刻生了一个大儿子(prototype),你父亲给你大哥买了很多玩具,然后又生了你,你一出生,那爸爸就把他的玩具给了你(通过new),然后你大哥也把那些玩具给了你,同时他还有一份,你出生的同时,你又有一个大儿子,你又给他买了很多玩具,你又生了一个小儿子,你大儿子又把玩具给了你小儿子一份,同时你也把你的玩具都给你小儿子(通过new)。。。这就是“长兄如父啊!”,你的东西是从你大哥那来的,而连接你们的纽带就是(proto)。

    相关文章

      网友评论

          本文标题:JS原型的理解历程

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