是真的构造函数的原型不能覆盖公共成员吗?

时间:2011-08-23 18:26:27

标签: javascript

示例1:

function Cat(){
    this.color = function (){
        return "Green";
    };
}

Cat.prototype.color = function(){
    return "Blue";
}

var kitty = new Cat();
alert(kitty.color()); // Green

示例2:

function Cat(){
    var color = function (){
        return "Green";
    };
}

Cat.prototype.color = function(){
    return "Blue";
}

var kitty = new Cat();
alert(kitty.color()); // Blue

示例2返回Blue,是因为构造函数无法覆盖公共成员,也无法访问私有成员?

1 个答案:

答案 0 :(得分:0)

示例2对构造函数中的color没有任何作用,因为它不是属性,而是其范围内的函数。例如1你应该意识到属性的查找以本地属性开始,如果没有找到,它继续原型属性。因此,在示例1的情况下,首先找到本地color - 方法并执行。本地和原型方法是不同的方法,可以在以下方面证明:

function Cat(){
    this.color = function (){
        return Cat.prototype.color ? Cat.prototype.color() : "Green";
    };
}

Cat.prototype.color = function(){
    return "Blue";
}

var prrr = new Cat;
alert(prrr.color()); //=> Blue

所以从这个意义上说,你的问题的答案是:是的。但不是:

function Cat(){
    this.color = function (){
        return Cat.prototype.color ? Cat.prototype.color() : "Green";
    };
}
Cat.prototype.color = function(){
    if (this.color && !this.colorOverwritten) {
        this.color = function(){return "Orange";};
        this.colorOverwritten = true;
    }
    return "Blue";
}

var prrr = new Cat;
alert(prrr.color()); //=> Blue
alert(prrr.color()); //=> Orange