首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承与原型链

继承与原型链
EN

Stack Overflow用户
提问于 2017-08-13 10:16:22
回答 2查看 65关注 0票数 1

最近,我一直在阅读关于JavaScript继承模型的。有一点我很困惑。以下是MDN的代码:

代码语言:javascript
复制
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的一个属性,虽然它是图的原型中定义的,但它仍然是图的一部分。

另外,我还有一个问题:如果某个对象继承了g(或者这么说是图),它将只继承addVertex (函数原型中定义的对象),或者它将继承图的所有三个属性,即顶点、边和addVertex。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-13 10:32:53

因为hasOwnProperty明确表示它在inherited属性上返回false

MDN

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

至于第二个问题,这完全取决于是如何从Graph继承对象的。以ES5的方式,我会这样做:

代码语言:javascript
复制
var InheritedFromGraph = function() {
  Graph.call(this);
}

InheritedFromGraph.prototype = Graph.prototype;

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

票数 1
EN

Stack Overflow用户

发布于 2017-08-13 10:31:37

为什么g.hasOwnProperty('addVertex')会产生假

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

hasOwnProperty()方法返回一个布尔值,指示对象是否具有自己的指定属性(而不是继承的)属性。

因此,hasOwnProperty在进行检查时不会遍历原型链。

您可以使用在……里面操作符检查prototype链中的属性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45659284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档