繁体   English   中英

Javascript不会调用prototype方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM