// 声明父类
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 是""。
是哪里代码写错了吗?
求教哈大神们!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.