小记ES5和ES6的类

作者: 王小贱吖 | 来源:发表于2018-03-01 17:37 被阅读26次

ES6中的类只是语法糖,它并没有改变类实现的本质。

举个例子,在ES5中定义一个类:

function Person(name) {

    this.name = name;

}

Person.prototype.sayHello = function(){

    return 'Hi, I am ' + this.name;

}

而用ES6的写法重写一下,检测类型发现Person本质上仍然是函数:

class Person {

    constructor(name){

        this.name = name;

    }

    sayHello(){

        return 'Hi, I am ' + this.name;

    }

}

typeof Person; //'function'

调用的方式都是一致的:

var me = new Person('Yecao');   

用ES6定义class中的方法,定义在原型对象上的。与ES5不同的是,这些定义在原型对象的方法是不可枚举的。

ES6类和模块是严格模式下的;

不存在变量提升,保证子类父类的顺序;

类的继承也有新的写法:

class Female extends Person {

    constructor(name){

        super(name); //调用父类的,调用之后,子类才有this

        this.gender = 'female';

    }

    sayHello(){

        return super.sayHello() + ', I am ' + this.gender;

    }

}注意点,子类必须在父类的构造函数中调用super(),这样才有this对象,因为this对象是从父类继承下来的。而要在子类中调用父类的方法,用super关键词可指代父类。

ES5中类继承的关系是相反的,先有子类的this,然后用父类的方法应用在this上。

ES6类继承子类的this是从父类继承下来的这个特性,使得在ES6中可以构造原生数据结构的子类,这是ES5无法做到的。

ES6也可以定义类的静态方法和静态属性,静态的意思是这些不会被实例继承,不需要实例化类,就可以直接拿来用。ES6中class内部只能定义方法,不能定义属性。在方法名前加上static就表示这个方式是静态方法,而属性还是按照ES5的方式来实现。

// ES5写法

Person.total = 0; //静态属性

Person.counter = function(){  //静态方法

    return this.total ++ ;

}

// ES6写法

class Person {

    ...

    static counter(){

        return this.total ++ ;

    }

}

Person.total = 0;

ES6中当函数用new关键词的时候,增加了new.target属性来判断当前调用的构造函数。这个有什么用处呢?可以限制函数的调用,比如一定要用new命令来调用,或者不能直接被实例化需要调用它的子类。

function Person(name){

    if(new.target === Person){

        this.name = name;

    }

    else{

        throw new Error('必须用new生成实例');

    }

}

目前浏览器对ES6支持的不好,如果要用ES6写代码,必须使用转译工具,比如Babel

最后上两张图,理一下__proto__, prototype, constructor之间的关系。

这两张图中其实有一处共同的错误,你发现了吗?

另外,我觉得ES5中的继承的图中,父构造函数与子构造函数也是可以有直接的关系的。

参考资料:

http://es6.ruanyifeng.com/ 阮一峰 ES 6标准入门

http://keenwon.com/1524.html?utm_source=tuicool&utm_medium=referral ES5和ES6中的继承

转载请注明出处:http://blog.csdn.net/fen747042796 野草园 

相关文章

  • ES5-ES6 class

    随笔小记; ES5: ES6:

  • day06-前端面试技巧-(面向对象)

    类与实例: 类的声明es5: es6中class的声明 生成实例实例类的对象(es5和es6的实例化方式是一样的)...

  • React中ES6和ES5的不同之处

    组件类的定义 es5 es6 状态初始化 es5 }) es6 属性初始化 es5 es6 组件抛出 es5 es...

  • es5 es6静态方法、类、单例模式

    es5中的类和静态方法 es5继承 es6中的类 es6里面的继承 es6里面的静态方法 es6单例模式 转载:h...

  • 小记ES5和ES6的类

    ES6中的类只是语法糖,它并没有改变类实现的本质。 举个例子,在ES5中定义一个类: function Perso...

  • es5实现class类

    es5没有类,只有构造函数。ES6新增了class,用于创建类。本文通过es5来实现es6的class(一个Ani...

  • JS中的类

    如何定义一个类 ES5中定义一个类: ES6以后的语法(可以看做是ES5的语法糖): ES6的类,完全可以看作构造...

  • RN-ES5 ES6写法对比

    模块引用 ES5 使用CommonJS 标准, 使用 require ES6 import 写法 导出类 ES5 ...

  • 3. 声明&&属性&&方法&&继承

    ES5 如何声明一个类 ES6 如何声明一个类,class只是语法糖,本质和ES5的声明类是一致的 属性 私有属性...

  • 实现数组去重的多种方法

    ES6 Array.from将类数组对象和可遍历的对象转换为数组 阮一峰ES6 ES5

网友评论

    本文标题:小记ES5和ES6的类

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