关于instanceof返回false的疑惑

新手上路,请多包涵

我手写了一个Stack的函数,然后使用new操作符创建了对象stk:

var Stack=function(){
    const stack=[];
    return{
        set: function(val){
            stack.push(val);
        },
        get:function(){
            return stack.pop();
        }
    }
}

var stk=new Stack()
stk instanceof Stack // false

但是当我在测试stk instanceof Stack时却发现结果返回false?new不是会将stk绑到Stack构造函数的原型链上吗?
于是我做了一个简单版的测试:

var A=function(){}
var a=new A()
a instanceof A // true

得到了让我迷惑的结果,还请各位大佬帮我解答一下

阅读 2.7k
3 个回答

你好,js中的new可以这样理解的:

var A=function(){}   // 这里的函数没有返回对象
var a=new A()        // 所以new之后返回函数本身的this指针,这里的a就是A的一个实例
a instanceof A // true
var A=function(){ return {} }   // 这里的函数返回了一个对象
var a=new A()        // 所以new之后返回是新的对象,也就是那个空对象{}的一个实例
a instanceof A       // 所以这里是false,因为a并不是A的实例,而是A函数构造出的一个新的对象

你的stack相关代码属于第二种情况。

补充说明一点,如果函数返回的不是一个对象,比如是一个字符串,那么这个返回会被忽略, a 仍然是A的一个实例,比如:

var A=function(){return "xxx"}
var a=new A()
a instanceof A // true

你可以打印下stk, Stack.prototype并不在他的原型链上

Stack这个函数返回的对象覆盖了正常的 new 对象创建步骤, 详情可以参考:
new 运算符

来看下 new 运算符干了些啥

简单地解释就是:

如果构造函数返回的是一个对象(不是 this),那么,new 的结果就是这个对象。这个对象如果没有代码让他跟当前构造函数产生关系,那就没关系。

如果没有返回值,返回 this,这个 this 才是 JS 根据当前构造函数产生的对象,建立了构造函数和原型链的关系。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题