instanceof false为构造函数返回对象

时间:2016-09-01 04:37:12

标签: javascript ecmascript-6

考虑下面的简单代码:

function C1() {
  let x=5;
}

var c1=new C1;
alert(c1 instanceof C1); // returns true


function C2() {
  let x=5;
  
  return { 
    getx() { return x; } 
  }
}

var c2=new C2;
alert(c2 instanceof C2); // returns false ! why ??

问题:

  1. 为什么c2不是C2的实例?

  2. 如何让一个构造函数返回一个对象(即C2)并且仍然有新的返回该构造函数的实例而不更改C2?

3 个答案:

答案 0 :(得分:3)

  

为什么c2不是C2的实例?

因为C2.prototype不在c2的原型链中。 c2原型链中唯一的对象是Object.prototype

  

如何让一个构造函数返回一个对象(即C2)并且仍然有新的返回该构造函数的实例?

您需要将构造函数的prototype对象放在对象的原型链中。

E.g。

function C2() {
  let x=5;

  return Object.create(C2.prototype, {
    getx: {value: function() { return x; }},
  });
}

这是你在构造函数中使用this免费获得的,所以你也可以这样做:

function C2() {
  let x=5;
  this.getx = function() { return x; };
}
  

无需更改C2

您可以通过Object.setPrototypeOf更改现有对象的原型(此方法可以取消优化代码)。

function C2() {
  let x=5;

  return { 
    getx() { return x; } 
  }
}

var c2=new C2;
Object.setPrototypeOf(c2, C2.prototype);

答案 1 :(得分:1)

这应该有效:

 function C2() {
    let x=5;
    this.getx = function() {
        return x;
    };
 };

了解当您致电new时,您创建了一个新对象,此对象将通过该函数中的this关键字进行引用。

<小时/> 如果你有一个函数返回一个值,你最终只能获得该值。这应该证明:

function C2() {
   let x=5;

   this.getx = function() {
     return x;
   };
   return new C1;
}

var c2=new C2;
alert(c2 instanceof C1); // returns true

答案 2 :(得分:-1)

你需要使用Class创建一个新对象,你不能创建一个新的函数函数。或者你需要使用原型

class C1 {

 constructor(){
  this.x=5;
 }
}

var c1=new C1();
alert(c1 instanceof C1); // returns true


class C2 {
  constructor(){
  this.x=5;
 }
  
 getx(){
 return x; 
}

}

var c2=new C2;
alert(c2 instanceof C2); // returns false ! why ??