继承和原型链

时间:2017-08-13 10:16:22

标签: javascript inheritance prototype

我最近在JavaScript继承模型上阅读了Mozilla Developer Network。我在一点上非常困惑。这是来自MDN的代码:

function Graph() {
  this.vertices = [];
  this.edges = [];
}
Graph.prototype = {
  addVertex: function(v) {
  this.vertices.push(v);
}
};
var g = new Graph();
console.log(g.hasOwnProperty('vertices'));// true
console.log(g.hasOwnProperty('addVertex'));// false
console.log(g.__proto__.hasOwnProperty('addVertex'));// true

我不明白的是,g.hasOwnProperty('addVertex')为什么会产生错误,因为addVertex是g的一个属性,虽然它在Graph的原型中定义但仍然是Graph的一部分。

另外我还有一个问题:如果某个对象继承自g(或者说是Graph),它将仅继承addVertex(在Prototype of function中定义的那些),或者它将继承图的所有三个属性,即顶点,边和addVertex。

2 个答案:

答案 0 :(得分:2)

  

为什么g.hasOwnProperty(' addVertex')产生错误

这就是hasOwnProperty的工作方式。来自MDN

  

hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性作为自己的属性( not inherited )。

所以hasOwnProperty在进行检查时不会遍历原型链。

您可以使用in运算符来检查原型链中的属性。

答案 1 :(得分:1)

因为hasOwnProperty明确说明它在inherited属性

上返回false

MDN

  

hasOwnProperty()方法返回一个布尔值,指示是否   object将指定的属性作为自己的(不是继承的)属性。

至于你的第二个问题 - 这取决于你有一个继承自Graph的对象如何。在ES5方式中,我会这样做:

var InheritedFromGraph = function() {
  Graph.call(this);
}

InheritedFromGraph.prototype = Graph.prototype;

然后,是的,InheritedGraph将获得verticiesedge在其构造函数中定义的属性。