我最近在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。
答案 0 :(得分:2)
为什么g.hasOwnProperty(' addVertex')产生错误
这就是hasOwnProperty
的工作方式。来自MDN:
hasOwnProperty()
方法返回一个布尔值,指示对象是否具有指定的属性作为自己的属性( not inherited )。
所以hasOwnProperty
在进行检查时不会遍历原型链。
您可以使用in运算符来检查原型链中的属性。
答案 1 :(得分:1)
因为hasOwnProperty
明确说明它在inherited
属性
MDN:
hasOwnProperty()方法返回一个布尔值,指示是否 object将指定的属性作为自己的(不是继承的)属性。
至于你的第二个问题 - 这取决于你有一个继承自Graph
的对象如何。在ES5方式中,我会这样做:
var InheritedFromGraph = function() {
Graph.call(this);
}
InheritedFromGraph.prototype = Graph.prototype;
然后,是的,InheritedGraph
将获得verticies
和edge
在其构造函数中定义的属性。