资讯专栏INFORMATION COLUMN

JavaScript的es6的class使用

zgbgx / 1861人阅读

摘要:记录的学习笔记,在回答别人的问题时发现自己的的理解误差很大的在没有带来的的时候,我们编写的时候很多时候会通过构造函数和原型链来添加方法属性,实现的功能。而是看成是构造函数的写法。等同于类的实例对象就像使用构造函数一样使用命令来创建一个实例。

记录class的学习笔记,在回答别人的问题时发现自己的的理解误差很大

javascript的class

在没有es6带来的class的时候,我们编写JavaScript的时候很多时候会通过构造函数和原型链来添加方法属性,实现class的功能。

// Box是一个构造器
function Box(color) {
    this.type = "circle";
    this.color = color;
}

// 我们可以通过prototype的方式来加一条实例方法
Person.prototype.hello = function() {
    console.log("hello " + this.color);
}

// 对于私有属性(Static method),我们当然不能放在原型链上了。我们可以直接放在构造函数上面
Person.fn = function() {
    console.log("static");
};
//通过new来创建
var circle = new Box("red");

但是在es6的规范中,可以使用class语法,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写,就是下面这样。

class Box {
    constructor(color) {
        this.color = color;
        this.type="corcle"
    }
    hello() {
        console.log("hello " + this.name);
    }
    static fn() {
        console.log("static");
    };
}

上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。

需要注意:
1.class内的方法不需要 function关键字,直接把函数定义放进去了就可以了。
2.另外,方法之间不需要逗号分隔,加了会报错。
3.class内部默认是严格模式,
需要注意这个和JavaScript中的对象写法是不一样的。而是看成是构造函数的写法。而且目前使用typeof来判断class的类型的时候返回的结果是function

constructor方法

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

class Box {
}

// 等同于
class Box {
  constructor() {}
}
类的实例对象

就像使用构造函数一样使用new命令来创建一个实例。如果忘记加上new,像函数那样调用Class,将会报错。

class Box{...}
var circle = new Box();

class的实例对象就和普通的对象类似,都是可以看过是通过new一个构造函数生成的,

这里有几个问题需要注意:

class表达式就像函数表达式一样,可以把class来赋值给变量,
class不存在变量提升,内部默认严格模式
暂时没有标准的支持私有方法和私有属性
this的指向是class实例对象,需要注意如果在外多带带调用方法时需要小心this的指向
Generator函数前面添加*即可

静态属性和方法 静态方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。

静态属性

ES6 明确规定,Class 内部只有静态方法,没有静态属性。所以应该这样书写一个静态属性:

class Foo {
}

Foo.prop = 1;
Foo.prop // 1

下面是错误的举一反三:

// 以下两种写法目前都无效
class Foo {
  // 写法一
  prop: 2

  // 写法二
  static prop: 2
}

Foo.prop // undefined
新提案中的静态属性、实例属性

不过目前已经有了新的提案来支持类的静态属性和实例属性,

实例属性

类的实例属性可以用等式,写入类的定义之中。

class MyClass {
  myProp = 42;

  constructor() {
    console.log(this.myProp); // 42
  }
}
静态属性

类的静态属性只要在上面的实例属性写法前面,加上static关键字就可以了。

class MyClass {
  static myStaticProp = 42;

  constructor() {
    console.log(MyClass.myStaticProp); // 42
  }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92376.html

相关文章

  • [译] 在你学习 React 之前必备 JavaScript 基础

    摘要:前言在理想的状态下,你可以在深入了解之前了解和开发的所有知识。继承另一个类的类,通常称为类或类,而正在扩展的类称为类或类。这种类型的组件称为无状态功能组件。在你有足够的信心构建用户界面之后,最好学习。 原文地址:JavaScript Basics Before You Learn React 原文作者: Nathan Sebhastian 写在前面 为了不浪费大家的宝贵时间,在开...

    Chaz 评论0 收藏0
  • ES6学习总结(三)

    摘要:不同于其他面向对象语言,以前的中中没有类的概念,主要是通过原型的方式来实现继承,中引入了原型链,并且将原型链用来实现继承,其核心是利用原型使得一个对象继承另一个对象的方法和属性,中原型继承的关键是将一个实例的原型对象指向另一个实例,因此前一 不同于其他面向对象语言,ES6以前的JavaScript中中没有class类的概念,主要是通过原型的方式来实现继承,JavaScript中引入了原...

    baoxl 评论0 收藏0
  • JavaScript 五十问——从源码分析 ES6 Class 实现机制

    摘要:防止类的构造函数以普通函数的方式调用。这个函数的主要作用是通过给类添加方法,其中将静态方法添加到构造函数上,将非静态的方法添加到构造函数的原型对象上。 Class是ES6中新加入的继承机制,实际是Javascript关于原型继承机制的语法糖,本质上是对原型继承的封装。本文将会讨论:1、ES6 class的实现细2、相关Object API盘点3、Javascript中的继承实现方案盘点...

    LeexMuller 评论0 收藏0
  • 从-1开始ES6探索之旅02:小伙子,你对象咋来?续篇 - 你对象班(class)里来

    摘要:这是因为子类没有自己的对象,而是继承父类的对象,然后对其进行加工。 温馨提示:作者的爬坑记录,对你等大神完全没有价值,别在我这浪费生命温馨提示-续:你们要非得看,我也拦不住,但是至少得准备个支持ES6的Chrome浏览器吧?温馨提示-再续:ES6简直了,放着不用简直令人发指! 书接上回,即便是程序员,也还是能够通过自己的努力辛辛苦苦找到合适对象的,见前文《javascript对象不完全...

    incredible 评论0 收藏0

发表评论

0条评论

zgbgx

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<