javascript基础从小白到高手系列四十三:原型与继承关系

原型与实例的关系可以通过两种方式来确定。第一种方式是使用instanceof 操作符,如果一个实
例的原型链中出现过相应的构造函数,则instanceof 返回true。如下例所示:
console.log(instance instanceof Object); // true
console.log(instance instanceof SuperType); // true
console.log(instance instanceof SubType); // true
从技术上讲,instance 是Object、SuperType 和SubType 的实例,因为instance 的原型链
中包含这些构造函数的原型。结果就是instanceof 对所有这些构造函数都返回true。
确定这种关系的第二种方式是使用isPrototypeOf()方法。原型链中的每个原型都可以调用这个
方法,如下例所示,只要原型链中包含这个原型,这个方法就返回true:
console.log(Object.prototype.isPrototypeOf(instance)); // true
console.log(SuperType.prototype.isPrototypeOf(instance)); // true
console.log(SubType.prototype.isPrototypeOf(instance)); // true
3. 关于方法
子类有时候需要覆盖父类的方法,或者增加父类没有的方法。为此,这些方法必须在原型赋值之后
再添加到原型上。来看下面的例子:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
// 继承SuperType
SubType.prototype = new SuperType();
// 新方法
SubType.prototype.getSubValue = function () {
return this.subproperty;
};
// 覆盖已有的方法
SubType.prototype.getSuperValue = function () {
return false;
};
let instance = new SubType();
console.log(instance.getSuperValue()); // false
在上面的代码中,加粗的部分涉及两个方法。第一个方法getSubValue()是SubType 的新方法,
而第二个方法getSuperValue()是原型链上已经存在但在这里被遮蔽的方法。后面在SubType 实例
上调用getSuperValue()时调用的是这个方法。而SuperType 的实例仍然会调用最初的方法。重点
在于上述两个方法都是在把原型赋值为SuperType 的实例之后定义的。
另一个要理解的重点是,以对象字面量方式创建原型方法会破坏之前的原型链,因为这相当于重写
了原型链。下面是一个例子:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
// 继承SuperType
SubType.prototype = new SuperType();
// 通过对象字面量添加新方法,这会导致上一行无效
SubType.prototype = {
getSubValue() {
return this.subproperty;
},
someOtherMethod() {
return false;
}
};
let instance = new SubType();
console.log(instance.getSuperValue()); // 出错!
在这段代码中,子类的原型在被赋值为SuperType 的实例后,又被一个对象字面量覆盖了。覆盖
后的原型是一个Object 的实例,而不再是SuperType 的实例。因此之前的原型链就断了。SubType
和SuperType 之间也没有关系了。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值