2012-12-05 42 views
8
var p = function() { 
    this.show = function() { 
     alert('hello world!!!'); 
    } 
} 

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

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

它报警"hello world!!!",为什么?为什么不在原型中声明函数?

我可以修改原型方法吗,如果是的话怎么样?

+1

一个非常全面的解释:http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript –

+1

FYI:如果你需要:你可以调用原型方法:'p。 prototype.show.call(o)' – Prinzhorn

回答

7

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

EcmaScript specification

由构造器创建的每个对象都有一个隐含的参考 (被称为对象的原型),其构造的 “原型”属性的值。此外,原型可能对其原型有一个非空的隐式引用,依此类推;这被称为 原型链。当引用一个对象中的一个属性时, 引用的是第一个对象 中包含该名称属性的原型链中该名称的属性。在其他 单词中,首先检查直接提及的对象是否具有这种 属性;如果该对象包含指定的属性,即引用所引用的 属性;如果该对象不包含 包含指定的属性,那么接下来检查该对象的原型 ;等等。

简而言之:当寻找一个函数(或其名称的任何属性)时,你从对象开始,然后在原型链上去。

+1

好回答=) –

3

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

1

在JavaScript中解析属性时,引擎首先查看对象的属性。在你的例子中,对象将由this表示。如果它找到属性,在这种情况下show(记住函数可以是属性),它使用该属性。如果没有找到该属性,则会重复原型链以解决该属性。

相关问题