记录一下尝试的class和function分别作为构造函数方法

  一直都在使用class作为new对象的写法,但是一直也知道在class没有出现时都是使用function作为new对象的。今天正好有时间尝试一下这两者的对应点,首先先放一张图作为前提解释。

  首先说明这个图片不是我画的。而是一位大佬的网图哈。这个实际上讲述的是原型和原型链相关的东西。可以联系我后面写到的东西来对比的看说明一些东西。首先列举一个简单的例子
        

  图片如上,简单的来说。这两个只是单纯的显示了不同声明方式的方法,没什么好说的。之后我们来尝试一下看一下给function添加prototype和__proto__方法。

        

  这里我们来简单解释一下。首先通过class声明的对象中。我们可以找到test1方法,它实际上是在__proto__指向的testdemo的prototype中,并且根据文章最开始的图片可以看出constructor和prototype实际上是互相指向的。通过案例可以证明

     

  这个同时也证明了另一个问题。原型链所查找属性是根据__proto__向上层查找的。通过new声明的对象是没有prototype的。

  其次 我们来探究一下static这个关键字究竟做了什么。因为我们根据之前看到的,我们虽然test4通过__proto__加到了testdemo2 中,但是new之后的对象却没办法找到这个了。只能通过testdemo2.test4来找到。那么这个好像和static的用法很类似?

    

 

  果然,其实我们所使用的static关键字和__proto__是一回事。一旦new了对象之后我们就没办法找到test6或者test4方法了。那么如果和变量一起使用呢?有没有什么特殊呢?

        

  可以看出static定义的方法并不能改变new之后的对象中的abc变量。这是因为我们通过testdemo.test6();这种方式修改的实际上都是constructor中的abc,而原型链查找变量时是根据__proto__查找,也就是说永远不可能查找到abc为6.况且就近原则也决定了它会优先获取对象中的abc,而不是沿着__proto__查找。

  上面有点乱。总结一下几个点。

  1、class和function实际上并没有什么区别。class仅仅是function的语法糖。

  2、class中在constructor通过this声明某个变量,实际上就是和在function直接this声明是一回事。

  3、class中static声明的变量和方法实际上都是加到了该类的constructor中,如果你通过new了一个对象,想通过这个对象获取到这些static是不行的。当然你也可以hack一点,通过对象.__proto__.constructor.static声明的变量去拿到这个参数.

  4、原型链是通过__proto__进行属性查找的。

  5、new出来的对象是没有prototype的

  6、通过function作为构造函数时,将方法加到它的prototype上,实际上和class中直接声明方法是一回事。他们都是将这个方法加到了实体对象的__proto__上,也就是该构造函数的prototype。这样实体对象通过__proto__自然可以找到该方法了。   

  
posted @ 2020-06-15 18:42  叫我小枫  阅读(345)  评论(0编辑  收藏  举报