首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混淆"instanceof“结果

混淆"instanceof“结果
EN

Stack Overflow用户
提问于 2013-06-13 21:13:29
回答 2查看 127关注 0票数 5
代码语言:javascript
复制
    function Foo() {}

    function Bar() {}

    Bar.prototype = new Foo()

    console.log("Bar.prototype.constructor === Foo ? " 
     + (Bar.prototype.constructor === Foo))

    console.log("new Bar() instanceof Bar? " 
     + (new Bar() instanceof Bar))
代码语言:javascript
复制
=> Bar.prototype.constructor === Foo ? true
=> new Bar() instanceof Bar? true

为什么"instanceof“结果不是"false",因为”构造函数“不是引用自身,而是引用继承的原型?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-13 21:23:23

instanceof不使用constructor属性。它在内部调用§15.3.5.3 of the specification中描述的function对象的[HasInstance]方法。

它将对象的原型(以及对象的原型等)与函数的prototype属性进行比较。

一个类似的实现是:

代码语言:javascript
复制
function myInstanceOf(obj, Constr) {
    // get prototype of object
    var proto = Object.getPrototypeOf(obj);

    // climb up the prototype chain as long as we don't have a match
    while (proto !==  Constr.prototype && proto !== null) {
        proto = Object.getPrototypeOf(proto);
    }

    return proto === Constr.prototype;
}

据我所知,任何内部方法都不使用constructor属性,只有用户生成的代码使用它。

票数 6
EN

Stack Overflow用户

发布于 2013-06-13 21:19:49

代码语言:javascript
复制
Bar.prototype = new Foo()

因此

代码语言:javascript
复制
Bar.prototype instanceof Foo

因此

代码语言:javascript
复制
Bar.prototype.contructor === Foo

构造函数返回对实际函数的引用

实例

instanceof和构造函数属性之间的区别(除了明显的语法区别)是instanceof检查对象的原型链。

所以:

代码语言:javascript
复制
=> new Bar() instanceof Foo? true
=> new Bar() instanceof Bar? true
=> new Bar() instanceof Object? true

以上都是事实。

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

https://stackoverflow.com/questions/17087977

复制
相关文章

相似问题

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