方法不在java脚本原型中覆盖

时间:2016-04-14 09:29:27

标签: javascript prototype


我只是阅读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)的目的是什么?

3 个答案:

答案 0 :(得分:4)

您有两个swingSword个功能。

一个是在原型上。另一个在实例上(由构造函数指定)。

当您尝试访问swingSword属性时,JS首先查看该对象,然后(如果它找不到它),它会查找原型链。

因此它首先找到由构造函数定义的那个,然后它停止查找。

简而言之:覆盖的方向与您预期的方向相反。

答案 1 :(得分:1)

在原型上定义函数会将该函数扩展到其所有实例。

当您调用该函数时,它将始终首先查看实例本身。如果它没有在实例上找到该函数,那么它会查看原型。

由于您实际上是通过直接在Ninja构造函数中创建swingSword函数来覆盖原型swingSword,这可确保Ninja的每个实例都已有swingSword功能,它永远不会在原型上寻找它。

答案 2 :(得分:0)

假设您在对象o。

中查询属性x

如果o没有具有该名称的自有属性,则查询属性x的o的原型对象。如果原型对象没有该名称的自有属性,但本身具有原型,则在原型的原型上执行查询。这将继续,直到找到属性x或搜索具有null原型的对象为止。

如您所见,对象的prototype属性创建了一个链或链表,从中继承了属性。

这个问题也是如此。你的对象有自己的功能,所以它永远不会在原型对象中查找它,你总是得到对象自己的swingSword()函数返回的结果......