我只是阅读java script prototype programming
,只试了一个小代码。
function Ninja(){
this.swingSword = function(){
return true;
};
}
//override the prev one
Ninja.prototype.swingSword = function(){
return false;
};
var ninja = new Ninja();
console(ninja.swingSword());
但我认为这个OP将是false
,不幸的是它输出为true
,我的第二种方法不会覆盖第一种方法。为什么呢?
只有Ninja.prototype.swingSword()
reference这才能正确覆盖.....
那么在这里创建object(ninja)
的目的是什么?
答案 0 :(得分:4)
您有两个swingSword
个功能。
一个是在原型上。另一个在实例上(由构造函数指定)。
当您尝试访问swingSword
属性时,JS首先查看该对象,然后(如果它找不到它),它会查找原型链。
因此它首先找到由构造函数定义的那个,然后它停止查找。
简而言之:覆盖的方向与您预期的方向相反。
答案 1 :(得分:1)
在原型上定义函数会将该函数扩展到其所有实例。
当您调用该函数时,它将始终首先查看实例本身。如果它没有在实例上找到该函数,那么它会查看原型。
由于您实际上是通过直接在Ninja构造函数中创建swingSword
函数来覆盖原型swingSword
,这可确保Ninja
的每个实例都已有swingSword
功能,它永远不会在原型上寻找它。
答案 2 :(得分:0)
假设您在对象o。
中查询属性x如果o没有具有该名称的自有属性,则查询属性x的o的原型对象。如果原型对象没有该名称的自有属性,但本身具有原型,则在原型的原型上执行查询。这将继续,直到找到属性x或搜索具有null原型的对象为止。
如您所见,对象的prototype属性创建了一个链或链表,从中继承了属性。
这个问题也是如此。你的对象有自己的功能,所以它永远不会在原型对象中查找它,你总是得到对象自己的swingSword()函数返回的结果......