ES6中class的执行顺序问题和一些个人理解

执行顺序

众所周知,ES6的class只不过是ES5定义对象的语法糖,今天学习的时候突然想到它的执行顺序是什么?

我们知道的class在ES6中就是一个函数,且只能通过new才能执行,执行的时候会自动调用里面的构造函数,

那么对于里面的方法它们是什么时候被放入class xx 的prototype中的呢?

下面用到代码验证一下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class obj{
            constructor(){
                this.x = 1;
            }
            s(){
                console.log("你好啊");
            }
        }
        console.log(obj.prototype);
        let y = new obj();
        console.log(y.__proto__);
    </script>
</body>
</html>

我们定义一个class obj,下面是第一个输出的内容也就是obj.prototype

在这里插入图片描述

明显可以看出来,在没有使用new之前,我们打印出的结果已经有在class中定义的函数了,这就意味着当class一旦被定义完成,那么里面的函数就已经呗挂载到了prototype中。

那如果我们实例化对象呢

在这里插入图片描述

这个也是指向的class的prototype。

个人理解

下面是我对ES6中理解class其实还是可以看做是对构造函数的映射,当我们new class 时,就调用里面的构造函数,如下图的关系:
在这里插入图片描述

当我们定义完class 函数,那么里面的函数就会被自动到prototype中的,当new class时,只会执行里面的constructor函数,来完对象的实例化,所以下述代码也是等效的效果。

 class obj{
            y = 3;
            constructor(){
                this.x = 1;
            }
            
        }
        obj.prototype.s = function(){
                console.log("你好啊");
        }
        
        console.log(obj.prototype);

对象的的属性在class中还可以使用不放在构造函数中,而直接放在class的顶层就可以完成定义

class obj{
            y = 3;
            constructor(){
                this.x = 1;
            }
            x = 4
        }
        obj.prototype.s = function(){
                console.log("你好啊");
        }
        
        console.log(obj.prototype);

可以看到在prototype中并没有x 和 y
在这里插入图片描述

这是否意味着它会把它放在实例对象中?

console.log(new obj());

在这里插入图片描述

果然如此,真实令人惊奇。下面下面这样定义则是无效的:

class obj{
            constructor(){
                
            }
            
        }
        obj.prototype.s = function(){
                console.log("你好啊");
        }
        obj.x = 2;
        console.dir(obj);

这样并不会在实例化的对象中出现x。我想是因为在class中定位属性,那么它会自动将其放入consructor中,并为其加this。

     obj.x = 2;
        console.dir(obj);

这样并不会在实例化的对象中出现x。我想是因为在class中定位属性,那么它会自动将其放入consructor中,并为其加this。

以上就是今天在使用ES6中突发的感想,有什么错误,请指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值