首页 > 解决方案 > 为什么 Javascript 类引用相同的构造函数?

问题描述

我试图在一个类上反映一个 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 对象似乎指向内存中的相同位置并引用相同的基本构造函数

标签: javascriptnode.jsreflectionconstructor

解决方案


我试图理解为什么非实例 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,您可以使用Class1or 或 with引用它Class1.prototype.constructor,而不是 with Class1.constructor

所以,你会发现:

Class1 !== Class2
Class1 === Class1.prototype.constructor
Class1.prototype.constructor !== Class2.prototype.constructor

为什么 Javascript 类引用相同的构造函数?

因为Class1.constructor是已经构造Class1好的 Function 对象的构造函数,而不是你的类的构造函数。您的类的构造函数是Class1or Class1.prototype.constructor


推荐阅读