手写了下 js 类的继承,请教个 js 问题

2022-01-10 16:50:22 +08:00
 gaocc
// 声明父类
function SuperClass() {
  this.superValue = true;
}
// 给父类添加公有方法
SuperClass.prototype.getSuperValue = function() {
  return this.superValue;
}
// 声明子类
function SubClass() {
  // 关键
  SuperClass.bind(this);
  this.subValue = false;
};
function inheritObject(o) {
  // 声明过渡函数对象(可以理解为类似子类)
  function F() {}
  // 过渡函数对象的原型 赋值为 父对象(理解为类似父类)
  F.prototype = o;
  // 返回过渡函数对象的实例,实例继承了父对象(父类)
  return new F();
}
// subClass 传子类; superClass 传父类
function inheritPrototype(subClass, superClass) {
   // 复制父类的原型,保存在变量
   let p = inheritObject(superClass.prototype);
   // 修复因为重写子类,导致子类的 constructor 属性被修改
   p.constructor = subClass;
   // 子类继承
   subClass.prototype = p;
}
// 子类继承父类(关键)
inheritPrototype(SubClass, SuperClass);
// 给子类添加公有方法
SubClass.prototype.getSubValue = function() {
  return this.subValue;
};
// 测试
let sub = new SubClass();
console.log(sub);
console.log(sub.getSuperValue());
console.log(sub.getSubValue());
// instanceof 是判断前面的对象,是否是后面对象(类)的实例。不是判断是否是父类
console.log(sub instanceof SuperClass); // true
console.log(sub instanceof SubClass); // true
// 打印

-------------分割线------------

疑问:console.log(sub.getSuperValue());这输出预想是 true ,原型上也有 getSuperValue ,但 name 是""。

是哪里代码写错了吗?

求教哈大神们!

1041 次点击
所在节点    问与答
5 条回复
ljtfdt
2022-01-10 17:23:06 +08:00
// 声明子类
function SubClass() {
// 关键
#SuperClass.bind(this); //这里错了吧 应该是 call 或者 apply
SuperClass.call(this);
this.subValue = false;
};
zhaol
2022-01-10 17:25:29 +08:00
SuperClass.bind(this)();
zhaol
2022-01-10 17:29:07 +08:00
@zhaol bind 是返回一个改变了 this 的函数但是不会立即执行,call 和 apply 会立即执行
gaocc
2022-01-12 10:12:54 +08:00
gaocc
2022-01-12 10:13:13 +08:00
嗯 感谢,是的。一下没注意

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/827367

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX