记录一下尝试的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__自然可以找到该方法了。