Javascript不会调用prototype方法

Thu*_*yen 6 javascript prototype private

我尝试覆盖一个方法和脚本是:

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();
Run Code Online (Sandbox Code Playgroud)

结果是'在包装中'.我不知道为什么?

Dmi*_*tin 5

任何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(); 
Run Code Online (Sandbox Code Playgroud)

另外,可以使用delete运算符删除自己的属性.删除后,该对象将使用继承的属性.

// delete the own property "doABC"
delete a['doABC'];

// the inherited "doABC" will be used. Alerts "in Model"
a.doABC();
Run Code Online (Sandbox Code Playgroud)

检查完整的工作演示.