javascript - 为什么 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 对象似乎指向内存中的相同位置并引用相同的基本构造函数
解决方案
我试图理解为什么非实例 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
or 或 with引用它Class1.prototype.constructor
,而不是 with Class1.constructor
。
所以,你会发现:
Class1 !== Class2
Class1 === Class1.prototype.constructor
Class1.prototype.constructor !== Class2.prototype.constructor
为什么 Javascript 类引用相同的构造函数?
因为Class1.constructor
是已经构造Class1
好的 Function 对象的构造函数,而不是你的类的构造函数。您的类的构造函数是Class1
or Class1.prototype.constructor
。
推荐阅读
- testing - 尽管没有任何错误但元素未打开,但 Click() 不起作用 - (赛普拉斯自动化)
- java - 正则表达式在前两个字母后允许空格而不是后面的数字
- java - 我的服务器端 Java 需要我的 jQuery 数组
- c# - 如何将一个表格放在另一个表格上
- angular - TypeScript 编译中缺少 angular2-realtimegeolocation/index.ts
- tensorflow - Tensorflow梯度为相同的输入产生不同的输出
- pdf - 当我通过 gs 将 .pdf 转换为 .ps 时出现问题
- django - 使用用户输入调用 Django 模板标签
- debugging - Several debugging profiles for Visual Studio 2017
- html - 文本溢出:省略号无法在 IE 和 Edge 中对所有行进行预标记或空白预文本