【发布时间】:2016-10-31 06:08:28
【问题描述】:
我绘制了下图来演示对象是如何继承的(函数构造函数标记为蓝色,从这些构造函数创建的对象标记为绿色):
这是创建这种层次结构的代码:
function Figure() {}
function Rect() {}
Rect.prototype = new Figure();
function Square() {}
Square.prototype = new Rect();
function Ellipse() {}
Ellipse.prototype = new Figure();
function Circle() {}
Circle.prototype = new Ellipse();
现在我想检查new Square() 是否继承自Rect,所以这是我希望JavaScript 引擎检查它的方式:
var s = new Square();
s instanceof Rect // ?
s.__proto__ === Rect.prototype // false
new Rect() new Figure()
s.__proto__.__proto__ === Rect.prototype // true
new Figure() new Figure()
所以s instanceof Rect 应该返回true。这是预期的,实际上是我运行代码时返回的内容。但是后来我想检查new Circle()是否继承自Rect,所以我遵循相同的逻辑:
var c = new Circle();
c instanceof Rect // ?
c.__proto__ === Rect.prototype // false
new Ellipse() new Figure()
c.__proto__.__proto__ === Rect.prototype // true
new Figure() new Figure()
因此,使用此检查逻辑 c instanceof Rect 应该返回 true,但如果我实际运行代码,c instanceof Rect 返回 false。我是不是对instanceof操作符的机制有误解?
【问题讨论】:
-
您能否在您的绘图中包含“对象”,以便我了解您认为箭头的走向?
-
JS 具有 prototype 驱动的结构,不是真正的多级类继承方案,典型的其他语言。每个对象都有一个指向 其 原型的隐含指针,这形成了一个单链接链。 Mozilla 基金会在developer.mozilla.org/en-US/docs/Web/JavaScript/… 上写了一篇很好的描述性文章,介绍了这个方案是什么,以及它不是。本文还讨论了 JS-vs.ECMA 和语言版本的差异。
-
@ChrisClark,
object在右边,是Figure.prototype -
我认为您应该首先在此处包含您的函数定义。
-
@MikeRobinson,我读过很多文章,这个问题是关于一个特别配置的继承链及其带来的混乱