为什么在实例化任何对象之前重新定义Function.prototype如此重要?

时间:2015-09-24 19:46:58

标签: javascript prototype

来自this example

function Graph() {
  this.vertices = [];
  this.edges = [];
}

Graph.prototype = {
  addVertex: function(v){
    this.vertices.push(v);
  }
};

var g = new Graph();

如果我首先重新定义原型,然后使用构造函数functio创建一个对象(如示例中所示),一切正常(即我可以调用g.addVertex("a");)。但如果我交换Graph.prototype = {...}var g = new Graph(); - 我就不能再调用g.addVertex()函数(方法)了。为什么呢?

2 个答案:

答案 0 :(得分:2)

因为您在创建实例后重新定义了整个原型,这意味着所有新实例都将获得新原型,但已创建的实例不会。实例不会知道它来自哪个构造函数的原型已完全改变。

答案 1 :(得分:2)

通常情况下,更改现有对象的原型是很好的。构造函数。但是,您要为Graph.prototype分配一个全新的对象,因此该实例在其__proto__属性中的引用不再是 与Graph.prototype相同。

如果您将方法添加到现有原型中,请执行以下操作:

Graph.prototype.addVertex = function(v){
    this.vertices.push(v)
}

然后它会以任何顺序工作。