ES6 javascript中Class类继承用法实例详解(3)
这种情况下, A其实就是构造函数Object的复制, A的实例就是Object的实例。
第二种特殊情况, 不存在任何继承。
class A {} A.__proto__ === Function.prototype // true A.prototype.__proto__ === Object.prototype // true
这种情况下, A 作为一个基类( 即不存在任何继承), 就是一个普通函数, 所以直接继承Funciton.prototype
。 但是, A调用后返回一个空对象( 即Object实例), 所以A.prototype.__proto__指向构造函数( Object) 的prototype属性。
第三种特殊情况, 子类继承null。
class A extends null {} A.__proto__ === Function.prototype // true A.prototype.__proto__ === undefined // true
这种情况与第二种情况非常像。 A也是一个普通函数, 所以直接继承Funciton.prototype。 但是, A 调用后返回的对象不继承任何方法, 所以它的__proto__指向Function.prototype, 即实质上执行了下面的代码。
class C extends null { constructor() { return Object.create(null); } }
4. Object.getPrototypeOf()
Object.getPrototypeOf
方法可以用来从子类上获取父类。
Object.getPrototypeOf(ColorPoint) === Point // true
因此, 可以使用这个方法判断, 一个类是否继承了另一个类。
5. super 关键字
super这个关键字, 有两种用法, 含义不同。
( 1) 作为函数调用时( 即super(...args)
), super代表父类的构造函数。
( 2) 作为对象调用时( 即super.prop
或super.method()
), super代表父类。 注意, 此时super即可以引用父类实例的属性和方法, 也可以引用父类的静态方法。
class B extends A { get m() { return this._p * super._p; } set m() { throw new Error(' 该属性只读 '); } }
上面代码中, 子类通过super关键字, 调用父类实例的_p属性。
由于, 对象总是继承其他对象的, 所以可以在任意一个对象中, 使用super关键字。
var obj = { toString() { return "MyObject: " + super.toString(); } }; obj.toString(); // MyObject: [object Object]
6. 实例的 __proto__ 属性
子类实例的 __proto__ 属性的 __proto__ 属性, 指向父类实例的 __proto__ 属性。 也就是说, 子类的原型的原型, 是父类的原型。
var p1 = new Point(2, 3); var p2 = new ColorPoint(2, 3, 'red'); p2.__proto__ === p1.__proto__ // false p2.__proto__.__proto__ === p1.__proto__ // true
内容版权声明:除非注明,否则皆为本站原创文章。