var p = function () {
this.show = function () {
alert('hello world!!!');
}
}
p.prototype.show = function() {
alert('haha');
}
var o = new p();
o.show();
它提醒"hello world!!!"
,为什么?
我可以修改原型方法吗?如果可以,如何修改?
这是因为您在构造函数中定义的特定函数会覆盖通过原型继承的函数。
来自EcmaScript规范:
构造函数创建的每个对象都有一个隐式引用(称为对象的原型)到其构造函数的值"prototype"属性。此外,原型可能具有非null对其原型的隐含引用等等;这被称为原型链。当引用对象中的属性时,该引用指向中第一个对象中该名称的属性包含该名称的属性的原型链。在其他单词,首先检查直接提到的对象所有物如果该对象包含命名属性,即引用所指的财产;如果该对象没有包含命名属性,则检查该对象的原型下一个等等
简而言之:当查找函数(或按其名称查找任何属性)时,您从对象开始,然后在原型链中向上。
在p
函数中重写prototype.show
方法。
在Javascript中,解析属性时,引擎首先查看对象的属性。在您的示例中,对象将由this
表示。如果它找到了属性,在本例中为show
(记住函数可以是属性),它将使用该属性。如果找不到该属性,则在原型链上向下迭代以解析该属性。