Baseline Widely available *
é¡å¥ (class) æ¯å¨ ECMAScript 6 ä¸å¼å ¥ï¼ç¨ä¾ä½çºå»ºç«æ°ç©ä»¶ç模æ¿ãå®è½å°ç¨å¼ç¢¼å°è£èµ·ä¾ä¾¿æ¼èçã é¡å¥åºæ¼ååï¼prototypeï¼ï¼ä½å¨èªæ³åå®ç¾©ä¸ï¼è ES5 çé¡é¡å¥ï¼class-likeï¼ææä¸åã
å®ç¾©é¡å¥é¡å¥å¯¦é䏿¯ä¸ç¨®ç¹å¥ç彿¸(functions)ï¼å°±è·ä½ å¯ä»¥å®ç¾©å½æ¸æè¿°å彿¸å®£å䏿¨£ï¼é¡å¥çèªæ³æå ©åå ä»¶ï¼é¡å¥æè¿°(class expressions)åé¡å¥å®£å(class declarations)ã
é¡å¥å®£åä¸åå®ç¾©é¡å¥çæ¹æ³æ¯ä½¿ç¨é¡å¥å®£å(class declaration)ï¼è¦å®£åä¸åé¡å¥ï¼ä½ è¦ä½¿ç¨ééµå class
æé
é¡å¥å稱(æ¤ä¾çº "Polygon")ã
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Hoisting
彿¸å®£ååé¡å¥å®£åçä¸åéè¦å·®å¥å¨æ¼å½æ¸å®£åæ¯ hoisted ï¼é¡å¥å®£åå䏿¯ã ä½ éè¦å
宣åä½ çé¡å¥ï¼ç¶å¾ååå®ï¼å¦å忝ä¸é¢çç¨å¼ç¢¼å°±æä¸åºä¸å ReferenceError
:
var p = new Polygon(); // ReferenceError
class Polygon {}
é¡å¥æè¿°
é¡å¥æè¿°æ¯å®ç¾©é¡å¥çå¦ä¸ç¨®æ¹æ³ãé¡å¥æè¿°å¯ä»¥æåç¨±ææ¯ç¡å稱ã賦äºä¸åæå稱é¡å¥æè¿°çå稱åªå¨é¡å¥ä¸»é«(class's body)䏿ä½ç¨ãï¼ä½æ¯é¡å¥æè¿°çå稱å¯ä»¥éé該é¡å¥ï¼ä¸æ¯å¯¦ä¾ï¼ç .name 屬æ§ååãï¼
// unnamed
var Polygon = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
// named
var Polygon = class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
注æï¼é¡å¥æè¿°è·ä¸è¿°æå°çé¡å¥å®£å䏿¨£ï¼é½æåå° hoisting çå½±é¿ã
é¡å¥ä¸»é«èæ¹æ³å®ç¾©é¡å¥çä¸»é«æçæ¯è¢«å¤§æ¬è({}
)å
å«çé¨åï¼ä½ å¯ä»¥å¨é裡é¢å®ç¾©é¡å¥æå¡(members)ï¼ä¾å¦æ¹æ³(methods)æå»ºæ§å(constructors)ã
é¡å¥å®£åèé¡å¥æè¿°ç主é«é½æä»¥å´æ ¼æ¨¡å¼(strict mode)å·è¡ï¼ä¹å°±æ¯èªªï¼å»ºæ§åãéæ æ¹æ³åååæ¹æ³ãgetter å setter 彿¸ç齿以崿 ¼æ¨¡å¼å·è¡ã
建æ§å建æ§å(constructor)
æ¹æ³æ¯ä¸åç¹å¥çæ¹æ³ï¼ç¨ä¾å»ºç«ååå§åä¸åé¡å¥
çç©ä»¶ãä¸åé¡å¥åªè½æä¸ååçºå»ºæ§å(constructor)çç¹å¥æ¹æ³ãç¶é¡å¥ä¸å«æä¸å以ä¸ç建æ§å
æ¹æ³æï¼SyntaxError
å°æè¢«æåºã
ä¸å建æ§åå¯ä»¥ç¨ééµå super
ä¾å¼å«ç¶é¡å¥ç建æ§åã
åè¦ method definitionsã
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// Method
calcArea() {
return this.height * this.width;
}
}
const square = new Polygon(10, 10);
console.log(square.area); //100
éæ
æ¹æ³(Static methods)
ééµå static
å®ç¾©äºä¸åé¡å¥çéæ
æ¹æ³ï¼éæ
æ¹æ³ä¸éè¦å¯¦é«å宿屬é¡å¥ç實ä¾å°±å¯ä»¥è¢«å¼å«ï¼å®ä¹ç¡æ³è¢«å·²å¯¦é«åçé¡å¥ç©ä»¶å¼å«ãéæ
æ¹æ³ç¶å¸¸è¢«ç¨ä¾å»ºç«çµ¦æç¨ç¨å¼ä½¿ç¨çå·¥å
·å½æ¸ã
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.sqrt(dx * dx + dy * dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
console.log(Point.distance(p1, p2)); // 7.0710678118654755
Instance properties
Instance properties å¿ é å¨ class å §å®ç¾©:
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
å®£åæ¬ä½ å®£åå
Œ
±æ¬ä½
å¨ JavaScript 以宣忬使¹å¯«ä¸é¢çç¨å¼ï¼å¯ä»¥å¯«æå¦ä¸ï¼
class Rectangle {
height = 0;
width;
constructor(height, width) {
this.height = height;
this.width = width;
}
}
ééäºå宣忬ä½ï¼é¡å¥å®ç¾©è®å¾æ´å self-documenting ï¼ä¸¦ä¸æ¬ä½æä¸ç´åå¨ã
å¦å¤ï¼å¦ä¸é¢ä¾åæç¤ºï¼è²æå段å¯ä»¥ä¸ç¨è¨å®é»èªå¼ã
æ³ç¥éæ´å¤è³è¨ï¼å¯åé± public class fieldsã
宣åç§ææ¬ä½ç§ææ¬ä½ç宣åï¼å¯ä»¥åè䏿¹ä¾åï¼
class Rectangle {
#height = 0;
#width;
constructor(height, width) {
this.#height = height;
this.#width = width;
}
}
å¾é¡å¥å¤é¨ä½¿ç¨ç§ææ¬ä½æåºç¾é¯èª¤ï¼ç§ææ¬ä½åªè½å¨é¡å¥å §è®å¯«ã
éé宣åéäºå¨é¡å¥ä»¥å¤ä¸å¯è¦çæ±è¥¿ï¼ä½ å¯ä»¥ç¢ºä¿é¡å¥ç使ç¨è 䏿åè³´é¡å¥çå §é¨çµæ§ï¼ç¢ç«ä¸åé¡å¥çå §é¨çµæ§å¯è½æé¨èçæ¬çæ´æ°èææè®åã
åè¨»ï¼ ç§ææ¬ä½åªè½å¨å»ºç«é¡å¥æäºå 宣åã
ç§ææ¬ä½ä¸åæ®éæ¬ä½ä¸æ¨£ï¼å¯ä»¥å¨é¡å¥å®£åå®å¾æå»ºç«ã
æ³ç¥éæ´å¤è³è¨ï¼å¯åé± private class featuresã
è£ç®±ãååæ¹æ³åéæ æ¹æ³ç¶ä¸åéæ
æ¹æ³æåå½¢æ¹æ³è¢«å¼å«ï¼ä½æ²æä¸åç©ä»¶çå¼è this ç¶å®æï¼è¢«å¼å«ç彿¸ä¸ this ééµåææ¯ undefined
ã卿¤æ
æ³ä¸ï¼èªåè£ç®±ï¼autoboxingï¼ä¸æç¼çãå³ä½¿æåå¨éå´æ ¼æ¨¡å¼ä¸å¯«ç¨å¼ï¼æ¤è¡çºä»ç¶æåå¨ï¼éæ¯å çºææçå½å¼ãå®ç¾©æ¹æ³ã建æ§åãgetter å setter 齿¯å¨å´æ ¼æ¨¡å¼ä¸å·è¡ãå æ¤ï¼è¥æåæ²æå®ç¾© this çå¼ï¼this ææ¯ undefined
ã
class Animal {
speak() {
return this;
}
static eat() {
return this;
}
}
let obj = new Animal();
obj.speak(); // Animal {}
let speak = obj.speak;
speak(); // undefined
Animal.eat(); // class Animal
let eat = Animal.eat;
eat(); // undefined
è¥æåå°ä¸è¿°ç¨å¼ç¨å³çµ±çå½å¼åºç¤é¡å¥(function based classes)表éï¼èªåè£ç®±åæä¾æ this å¨å ¶è¢«å¼å«çå½å¼ä¸æç¶å®çå¼ç¼çã
function Animal() {}
Animal.prototype.speak = function () {
return this;
};
Animal.eat = function () {
return this;
};
let obj = new Animal();
let speak = obj.speak;
speak(); // å
¨åç©ä»¶
let eat = Animal.eat;
eat(); // å
¨åç©ä»¶
ç¨ extends
建ç«åé¡å¥
ééµå extends
æ¯å¨é¡å¥å®£åææ¯é¡å¥æè¿°ä¸å»ºç«åé¡å¥çæ¹æ³ã
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + " makes a noise.");
}
}
class Dog extends Animal {
speak() {
console.log(this.name + " barks.");
}
}
var d = new Dog("Mitzie");
d.speak(); // Mitzie barks.
è¥å¨åé¡å¥ä¸æå»ºæ§å(constructor)ï¼è¦ä½¿ç¨ this ååå¿ é å å¼å« super()å½å¼ã
ä½ ä¹å¯ä»¥æ´å (extends)å³çµ±çå½å¼åºç¤"é¡å¥"ã
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function () {
console.log(this.name + " makes a noise.");
};
class Dog extends Animal {
speak() {
console.log(this.name + " barks.");
}
}
var d = new Dog("Mitzie");
d.speak(); // Mitzie barks.
注æé¡å¥ä¸¦ç¡æ³æ´å
ä¸è¬(non-constructible ä¸å¯å»ºæ§ç)ç©ä»¶ãå¦æä½ æ³è¦ç¹¼æ¿èªä¸è¬çç©ä»¶ï¼å¯ä»¥ä½¿ç¨Object.setPrototypeOf()
ä¾éæã
var Animal = {
speak() {
console.log(this.name + " makes a noise.");
},
};
class Dog {
constructor(name) {
this.name = name;
}
}
// å¦æä½ æ²æç¨ä»¥ä¸çæ¹æ³ï¼ç¶ä½ å¼å«speakææåºç¾TypeError
Object.setPrototypeOf(Dog.prototype, Animal);
var d = new Dog("Mitzie");
d.speak(); // Mitzie makes a noise.
Species
ä½ å¯è½æå¸æå¨é£åçè¡çé¡å¥ MyArray
ä¸åå³é£å (Array
) ï¼Species é忍¡å¼è®ä½ è½è¦å¯«é»èªç建æ§å (contructor)ã
èä¾ä¾èªªï¼ç¶ä½ 使ç¨å map()
é顿åå³é»èªå»ºæ§åçæ¹æ³æï¼ä½ 叿è½åå³ç¶ç©ä»¶ Array
ï¼è䏿¯ MyArray
ç©ä»¶ã Symbol.species
符èè®ä½ åå°éä»¶äºï¼
class MyArray extends Array {
// Overwrite species to the parent Array constructor
static get [Symbol.species]() {
return Array;
}
}
var a = new MyArray(1, 2, 3);
var mapped = a.map((x) => x * x);
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true
ç¨ super
å¼å«ç¶é¡å¥
ééµå super
æ¯ç¨ä¾æä¾ä¸åé¡å¥å¼å«å
¶ç¶é¡å¥ç彿¸ã
class Cat {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + " makes a noise.");
}
}
class Lion extends Cat {
speak() {
super.speak();
console.log(this.name + " roars.");
}
}
var l = new Lion("Fuzzy");
l.speak();
// Fuzzy makes a noise.
// Fuzzy roars.
ES5 ç¹¼æ¿èªæ³è ES6 é¡å¥èªæ³çæ¯è¼
TBD
ç¯ä¾TBD
è¦æ ¼ ç覽å¨ç¸å®¹æ§ åè¦RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4