【问题标题】:Object is still a instanceof original constructor after changing constructor property更改构造函数属性后,对象仍然是原始构造函数的实例
【发布时间】:2015-12-27 18:32:57
【问题描述】:

我很困惑为什么在将对象的构造函数属性更改为指向另一个函数之后,该对象仍然是旧构造函数的实例

//Original Constructor
      function orig_cons() {}

//New Constructor
  function new_cons(){}

 //Adding property to myfun prototype
  new_cons.prototype.x = 1;

 //Invoking a new object of 1st constructor
  var obj1 = new orig_cons();

//check obj1 instanceof 1st constructor
 console.log(obj1 instanceof orig_cons); // true

 //Changing constructor property to point to 2nd function
  obj1.constructor = new_cons;

//check obj1 instanceof 2nd function
 console.log(obj1 instanceof new_cons); // false

而且obj1的prototype属性还是原来构造函数的prototype:

       console.log(Object.getPrototypeOf(obj1)); //orig_cons {}

【问题讨论】:

  • constructor 属性与instanceof 的工作方式无关。
  • 创建后更改构造函数时原型链没有变化,对象原型仍然相同。
  • 清理你的代码片段 - myfun 与那里的任何东西有什么关系?并使用内联代码 sn-p

标签: javascript constructor


【解决方案1】:

instanceof 检查对象的原型而不是构造函数,举个例子:

function Person(name){
  this.name = name;
}

var  p = new Person();

console.log(p instanceof Person); //true

function Func(){}

p.constructor = Func;

console.log(p instanceof Person); // true

Person.prototype = {};

console.log(p instanceof Person); // false

注意更改原型如何影响instanceof

来自 MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

instanceof 操作符测试constructor.prototype 在 对象的原型链。

【讨论】:

  • 好的。但是原型属性在构造函数上是可用的,所以实例化对象如何维护到它的原始原型的链接我的意思是哪个属性,是通过__proto__ 吗?
  • object 会用__proto__(non standard) 引用它,你可以使用Object.getPrototypeOf() 以标准投诉方式访问它
  • 如果通过__proto__维护链接,constructor.prototype的实际用处是什么
  • 当你调用构造函数时,新创建的对象的__proto__被设置为constructor.prototype.so,对象获取到构造函数prototype中预定义属性的访问权。记住每个对象有一个__proto__ 属性链接到它的原型,但只有函数才能获得“隐式”prototype 属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2018-06-11
  • 2017-11-10
  • 2014-01-05
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多