犀牛书笔记 (第9章 类)

犀牛书笔记 (第9章 类)

ES6之前的类:

Js中类使用基于原型的继承。如果两个对象从同一个原型继承属性,就说这两个对象是同一个类的实例,通常意味着它们是同一个构造函数或工厂函数创建和初始化的。

new.target: 如果函数通过构造函数调用,target引用它所在的构造函数;如果通过普通函数调用,是undefined.

new Constructor()调用的时候会自动把Constructor.prototype作为新对象的原型。

箭头函数没有prototype属性,因此不能作为构造函数使用。

如果两个构造函数的prototype属性指向同一个原型对象,则两个构造函数都可以用于创建同一个类的实例。o instanceof C: 如果o继承C.prototype/o继承的对象继承了C.prototype, 则表达式求值为true。

普通Js函数(不包括箭头函数、生成器函数和异步函数)都可以用作构造函数。因为函数都有prototype属性。这个属性的值是一个对象,有一个不可枚举的constructor属性。

let F = function() {}
let p = F.prototype
let c = p.constructor
c === F

let o = new F()
o.constructor === F

使用class关键字的类:

新增的class并未改变Js类基于原型的本质,而是一个语法糖。

继承使用extends关键字。

类的声明也语句和表达式两种形式。

let Square = class {constructor(x) {this.area = x * x;} }

class声明体中的代码默认处于严格模式,而且类声明无法提升。

静态方法:static放在class体里的方法声明前。静态方法是作为构造函数而非原型对象的属性定义的。即static xxx, 那么这样定义的xxx方法,是作为Constructor.xxx(), 而非Constructor.prototype.xxx().

getter和setter:

对象字面量支持的所有简写的方法定义语法都可以在类体中使用。

私有字段:#xxx

class Buffer {
    #size = 0
    get size() { return this.#size; }
}

完整的用法,见犀牛书214页的例9-4.

子类:

ES6之前:

Span.prototype = Object.create(Range.prototype);

Span.prototype.constructor = Span;

ES6中:通过extends和super创建子类

发表回复

*您的电子邮件地址不会被公开。必填项已标记为 。

*
*