JavaScript: instanceof 运算符

IT技术 javascript prototype
2021-02-07 13:12:12

第一个代码:

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype = {};

[ myobject instanceof MyConstructor,   // false - why?
myobject.constructor == MyConstructor, // true
myobject instanceof Object ]           // true

即使MyConstructor.prototype被替换myobject仍然继承Myconstructor.prototype. 那为什么是myobject instanceOf Myconstuctor假的呢?

function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject instanceof MyConstructor  // true (it is because myobject still inherits from
                                   // Myconstructor.prototype although it has been replaced)

第二:

 function MyConstructor() {}
 MyConstructor.prototype = {};
 var myobject = new MyConstructor();

 myobject.constructor == MyConstructor;  // false (accepted )

因此,如果 myobject.constructor 是 Object 为什么第一个:示例没有指向它,如何myobject.constructor仍然指向MyConstructor因为Myconstructor.prototype在第一个示例中已更改。

你能澄清一下吗?

1个回答

即使 MyConstructor.prototype 被替换,myobject 仍然继承 Myconstructor.prototype 的属性。

不。它继承自被替换的旧对象。并且由于该对象是!== MyConstructor.prototype,因此instanceof运算符将产生 false。在您的第二个示例中,myobject继承自新原型(当前MyConstructor.prototype),这就是instanceof告诉您的内容。

所以如果 myobject.constructor

constructor财产与 完全无关instanceof

function Constructor() {}
var oldProto = Constructor.prototype;
var oldInstance = new Constructor();

Constructor.prototype = {constructor:"something else"};
var newProto = Constructor.prototype;
var newInstance = new Constructor();

// all these are true:
Object.getPrototypeOf(oldInstance) === oldProto;
Object.getPrototypeOf(newInstance) == newProto;
oldProto !== newProto;
oldProto.constructor === Constructor; // was set implicitly on creating the function
oldInstance.constructor === oldProto.constructor; // inherited
newProto.constructor === "something else"; // if not explicitly set, comes from Object.prototype
newInstance.constructor === newProto.constructor; // inherited

Constructor.prototype === newProto;
newInstance instanceof Constructor; // because the above

Constructor.prototype !== oldProto;
! (oldInstance instanceof Constructor) // because the above
您几乎可以设置所有属性(只有少数不可写属性)。
2021-03-26 13:12:12
你错误地设置了 oldProto.constructor==Constructor ,它应该是 oldInstance.constructor==constructor
2021-04-01 13:12:12
根据您的回复,如果我执行 {}.constructor="foo" 并检查 {}.constructor ,结果又是同一个 Object 为什么会这样?
2021-04-01 13:12:12
我没有设置。不,这两个表达都是真的
2021-04-11 13:12:12
oo 这样我们可以设置构造函数属性吗?非常好的帖子
2021-04-12 13:12:12