js class

来源:互联网 发布:log4j2 java api 编辑:程序博客网 时间:2024/06/05 12:02

类不存在变量提升(hoist),这一点与 ES5 完全不同。

new Foo(); // ReferenceErrorclass Foo {}

与函数一样,类也可以使用表达式的形式定义。

const MyClass = class Me {  getClassName() {    return Me.name;  }};
上面代码使用表达式定义了一个类。需要注意的是,这个类的名字是MyClass而不是MeMe只在 Class 的内部代码可用,指代当前类。
与 ES5 一样,实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。

//定义类class Point {  constructor(x, y) {    this.x = x;    this.y = y;  }  toString() {    return '(' + this.x + ', ' + this.y + ')';  }}var point = new Point(2, 3);point.toString() // (2, 3)point.hasOwnProperty('x') // truepoint.hasOwnProperty('y') // truepoint.hasOwnProperty('toString') // falsepoint.__proto__.hasOwnProperty('toString') // true
上面代码中,xy都是实例对象point自身的属性(因为定义在this变量上),所以hasOwnProperty方法返回true,而toString是原型对象的属性(因为定义在Point类上),所以hasOwnProperty方法返回false。这些都与 ES5 的行为保持一致。

私有方法是常见需求,但 ES6 不提供,只能通过变通方法模拟实现。

class Widget {  foo (baz) {    bar.call(this, baz);  }  // ...}function bar(baz) {  return this.snaf = baz;}
还有一种方法是利用Symbol值的唯一性,将私有方法的名字命名为一个Symbol

const bar = Symbol('bar');const snaf = Symbol('snaf');export default class myClass{  // 公有方法  foo(baz) {    this[bar](baz);  }  // 私有方法  [bar](baz) {    return this[snaf] = baz;  }  // ...};

Class 的取值函数(getter)和存值函数(setter)


class MyClass {  constructor() {    // ...  }  get prop() {    return 'getter';  }  set prop(value) {    console.log('setter: '+value);  }}let inst = new MyClass();inst.prop = 123;// setter: 123inst.prop// 'getter'


原创粉丝点击