类中声明的函数实际上是绑定在原型上的
这样的话,下面两种代码是等价的。
class A {
hello() {}
}
// 等于
function A() {}
A.prototype.hello = function() {};
构造函数原型的constructor指向它本身
class A {
hello() {}
}
A.prototype.constructor === A // true
类必须使用new
调用,否则会报错。(调用:new A())
实例的属性除非显式定义在其本身(即定义在this
对象上),否则都是定义在原型上(即定义在class
上)
类的所有实例共享一个原型对象(如下),可以通过实例的__proto__
属性为“类”添加方法。
var p1 = new Point(2,3);
var p2 = new Point(3,2);
p1.__proto__ === p2.__proto__
//true
对象=属性+方法;对象是类的实例化
反引号(`)可以定义多行文本和内嵌表达式,这种字符串是被反引号包围( `
),并且以${ expr }
这种形式嵌入表达式。
元组 Tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为string
和number
类型的元组。
// Declare a tuple type
let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error
当访问一个已知索引的元素,会得到正确的类型:
console.log(x[0].substr(1)); // OK
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'
当访问一个越界的元素,会使用联合类型替代:
x[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型
console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString
x[6] = true; // Error, 布尔不是(string | number)类型
ReadonlyArray类型的数组可以用类型断言重写:
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
a = ro; // error!
a = ro as number[];