You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionA(){this.name='Becca';}A.prototype.sayHi=function(){console.log('Hi ',this.name)};// 在 A 原型对象中添加一个方法A.staticFun=function(){console.log('staticFun')};// 给 A 添加一个静态方法functionB(){A.call(this);this.b='Hello world';}B.prototype=Object.create(A.prototype,{constructor: {value: B,writable: true,configurable: true}});letb=newB();b.sayHi();// Hi Beccab.staticFun();// Uncaught TypeError: b.staticFun is not a function
继承步骤
Object.create:
B.prototype.proto = A. prototype; 让 B 的原型链对象的指针指向 A 的原型对象
B.prototype. constructor = B; 让 B 的 constructor 指向自身
A.call(this):
创建 B 的时候,B 就有了自己的 this,所以需要用 call 方法改变 this 指向,让 B的实例属性 继承 A的实例属性。
题目
题目来源
ES 5 使用 Object.create 创建的对象
继承步骤
实例 b 的原型链如下:
在控制台验证原型链,
Q:为什么构造函数 B 和实例 b 都没有继承到静态方法 staticFun 呢?
A:
B.__proto__
没有指向A.__proto__
,而是指向了Function.prototype
。MDN 表示,构造函数只能传递
Father.prototype
中的属性和方法给子级或者实例,而不能传递Father.
下的属性和方法。console 结果验证了这一点, ES 5 使用的寄生组合式继承无法自动继承父级的静态方法。
ES 6 使用 class 关键字创建的对象
ES 6 引入了一套新的关键字用来实现 class,包括
class
,constructor
,static
,extends
和super
。继承步骤
说明 ES 6 使用的原型链继承,将自身原型链指向父级,所以可以继承父级的任何属性。
class B 的原型链:
super() 与 A.call(this) 实现继承时的区别
在继承原生构造函数的情况下,A.call(this) 无法获取原生构造函数的内部属性,super() 可以。
总结
本篇参考
The text was updated successfully, but these errors were encountered: