class的继承:
前置内容
class Point {
constructor(x, y) {
this.x = x
this.y = y
}
toString() {
return `(${this.x},${this.y})`
}
/* 静态方法 */
static hello() {
console.log("hello world!")
}
}
// 子类实例的构建,基于父类实例
// super 方法调用父类的实例。使用了super后,才能用this
class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y) // super作为方法,用在子类的构造,必须在this之前先调用
this.color = color
}
toString() {
// super作为对象(对象调用方法),指向的是父类的原型对象即Point.prototype
console.log(Point.prototype.toString === super.toString) // true
return `color: ${this.color}, ${super.toString()}`
}
}
-
子类和父类是通过什么关键字实现继承?父类是Point,子类是ColorPoint如何写?
通过extends关键字
class ColorPoint extends Point{ }
-
子类的属性和方法中,哪个关键字是必须的?这个关键字怎么用?为什么要这么用?
super关键字必须。
super关键字有两种用法,作为方法和作为对象。
作为方法时,用在constructor方法中(用于子类的构造),必须在this之前调用。
作为对象时,用在其他方法中,调用父类的方法用。指向的是父类的原型对象。
Point.prototype.toString === super.toString // true /* super作为对象时,不能不调用方法,直接拿来用,比如 Point.prototype === super 就会控制台报错 */
-
ColorPoint.hello()
会输出什么?为什么?会输出 hello world! 因为
ColorPoint
是Point
的子类,会继承它的所有方法。hello()
是Point
的静态方法,也会被子类ColorPoint
继承。 -
如何从子类获取父类?代码演示
Object.getPrototypeOf(ColorPoint) === Point //true
用
Object.getPrototypeOf(childClass)
的方法可以判断一个类是否继承了另一个类 - 简述一下super的两种使用场景
super可作为方法,也可作为 对象
方法:子类的constructor中使用。
对象:在子类的其他方法中使用。普通方法 = > 指向父类原型对象(父类的方法全部定义在原型对象上); 静态方法 => 指向父类
-
子类的
__proto__
属性,指向的是什么?子类的
__proto__
属性指向父类colorPoint.__proto__ === Point // true // 构造函数的继承
-
子类的prototype属性的
__proto__
属性指向什么?子类的prototype属性的
__proto__
属性指向父类的prototype属性colorPoint.prototype.__proto__ === Point.prototype // true // 类的方法的继承
-
原生构造函数有哪些?简述下Boolean构造函数的用法.
Boolean Number String Array Date Function Regexp Error ObjectBoolean() Boolean 对象是一个布尔值的对象包装器。当需要判断一个对象是正负时,可以这么做 将非布尔值转化为布尔值,用Boolean方法,Boolean(exp) 或者 !!(exp)
- ES5的方法实现继承,可以继承到原生的构造函数吗?为什么?
ES5是先新建子类的实例对象this,再将父类的属性添加到子类上。由于父类的内部属性无法获取,导致无法继承原生的构造 函数。
- ES6的方法实现继承,可以继承到原生的构造函数吗?为什么?
ES6 是先新建父类的实例对象this,然后再用子类的构造函数修饰 this,使得父类的所有行为都可以继承。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。