8
var p = function () {
    this.show = function () {
       alert('hello world!!!');
    }
}

p.prototype.show = function() {
    alert('haha');
}

var o  = new p();
o.show();

会报警"hello world!!!",为什么?

我可以修改原型方法吗,如果可以怎么办?

4

3 回答 3

7

这是因为您在构造函数中定义的特定函数会覆盖通过原型继承的函数。

来自EcmaScript 规范

构造函数创建的每个对象都有一个对其构造函数的“原型”属性值的隐式引用(称为对象的原型)。此外,原型可能具有对其原型的非空隐式引用,依此类推;这称为原型链。当引用对象中的属性时,该引用是指原型链中包含该名称属性的第一个对象中该名称的属性。换句话说,首先检查直接提到的对象是否具有这样的属性;如果该对象包含命名属性,即引用所指的属性;如果该对象不包含命名属性,则接下来检查该对象的原型;等等。

简而言之:在查找函数(或任何按其名称的属性)时,您从对象开始,然后在原型链中向上。

于 2012-12-05T08:21:06.640 回答
3

您在函数中覆盖您的prototype.show方法p

于 2012-12-05T08:20:39.183 回答
1

在 Javascript 中,当解析属性时,引擎首先查看对象的属性。在您的示例中,对象将由 表示this。如果它找到该属性,在这种情况下show(记住函数可以是属性)它使用该属性。如果未找到该属性,则沿原型链迭代以解决该属性。

于 2012-12-05T08:24:01.460 回答