![](/img/trans.png)
[英]Why, in JavaScript, does '3 instanceof Number' == false, but '3..method()' will call Number.prototype.method?
[英]Javascript does not call prototype method
我尝试覆盖一个方法和脚本是:
function wrapper(target) {
target.doABC = function () {
alert('in wrapper');
};
return target;
}
function Model() {
wrapper(this);
}
Model.prototype.doABC = function () {
alert('in Model');
};
var a = new Model();
a.doABC();
结果是'在包装中'。 我不知道为什么?
任何JavaScript对象都有自己的和继承的属性。 自己是直接在实例上定义的并且继承自prototype
对象。
使用属性访问器时 ,JavaScript首先在对象自己的属性列表中搜索。 如果找不到该属性,则会在对象的原型链中进行搜索。
在您的示例中, wrapper()
方法在对象实例上定义了一个自己的属性doABC
,它是一个警告'in wrapper'
的函数。 即使对象具有相同属性的原型doAbc
,它'in Model'
中发出警告,但JavaScript仍然会使用自己的属性。
function wrapper(target) {
// Define an own property "doABC"
target.doABC = function () {
alert('in wrapper');
};
return target;
}
function Model() {
wrapper(this);
}
// Define an inherited property "doABC"
Model.prototype.doABC = function () {
alert('in Model');
};
var a = new Model();
//Use the own property "doABC". The inherited "doABC" is ignored.
a.doABC();
另外,可以使用delete
运算符delete
自己的属性。 删除后,该对象将使用继承的属性。
// delete the own property "doABC"
delete a['doABC'];
// the inherited "doABC" will be used. Alerts "in Model"
a.doABC();
检查完整的工作演示 。
让我看看我是否可以解释:
这里有两个单独版本的doABC
。
你target.doABC
创建了一个函数特定于该实例Model
和每个Model
获得自己doABC
。
因为Model
有一个doABC
,所以JavaScript引擎不需要为了其他东西而“查找链”,因此它永远不会寻找Model.prototype.doABC
版本。
你可以通过添加以下行来看到这一点:
Model.prototype.doXYZ = function () {
alert('in Model');
};
并打电话
a.doXYZ();
由于a
当时没有自己的doXYZ
,只有这样,它会查找链并查看原型中的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.