我试图在类上反映一个javascript对象,但是由于某种原因,似乎所有javascript类的构造函数都指向内存中的同一引用对象。这意味着我无法在2个单独的javascript类上反映2个不同的对象,因为第一个只是被第二个覆盖。
require('reflect-metadata');
class Class1 {}
class Class2 {}
class Sub1 {}
class Sub2 {}
Reflect.defineMetadata("METADATA", Sub1, Class1.constructor);
Reflect.defineMetadata("METADATA", Sub2, Class2.constructor);
console.log(Class1.constructor === Class2.constructor); // true
console.log(Reflect.getMetadata('METADATA', Class1.constructor)) // [Function: Sub2]
const cls1 = new Class1();
const cls2 = new Class2();
Reflect.defineMetadata("METADATA", Sub1, cls1.constructor);
Reflect.defineMetadata("METADATA", Sub2, cls2.constructor);
console.log(cls1.constructor === cls2.constructor); // false
console.log(Reflect.getMetadata('METADATA', cls1.constructor)) // [Function: Sub1]
我试图理解为什么非实例JavaScript对象似乎指向内存中的相同位置并引用相同的基本构造函数
我试图理解为什么非实例JavaScript对象似乎指向内存中的相同位置并引用相同的基本构造函数
类名是构造函数本身。因此,如果您想要对每个类的构造函数的唯一引用,请使用类名称本身。
另一方面,Class1
是一个已经构造的Function对象,因此Class1.constructor
也是该Function对象的构造函数Class2.constructor
,因此它们每个都指向相同的Function对象构造函数。这就是为什么:
Class1.constructor === Class2.constructor
Class1.constructor === Function.prototype.constructor
function f() {}
Class1.constructor === f.constructor
如果要使用构造函数Class1
,则可以使用Class1
或引用Class1.prototype.constructor
,而不使用Class1.constructor
。
因此,您会发现:
Class1 !== Class2
Class1 === Class1.prototype.constructor
Class1.prototype.constructor !== Class2.prototype.constructor
为什么Javascript类引用相同的构造函数?
因为Class1.constructor
是已经构造的Class1
Function对象的构造函数,而不是您的类的构造函数。您的类的构造函数为Class1
或Class1.prototype.constructor
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句