使用ES6,JavaScript具有适当的类语法,允许您将它们声明为class A {}
或const A = class {}
。后者是类表达式。
我正在开发一个可以自定义的项目。除了前缀之外,用户将创建一个具有相同名称的新文件,并且文件中的任何内容都会覆盖原始文件。但是,似乎你不能用类表达式的构造函数来做这件事。
const A = class {};
A.constructor = function(name) {
this.name = name;
}
您希望上述内容有效,(甚至A.prototype.constructor
),但事实并非如此。
如何以这种方式正确定义构造函数?我不能在课堂宣言中提到它。
答案 0 :(得分:2)
class
语法创建构造函数并填充分配给其prototype
属性的对象。没有与构造函数分开的“类”。在您的示例中,A
是对class {}
表达式创建的构造函数的引用。虽然您可以替换分配给constructor
的对象上的A.prototype
属性的值,但这不会更改A
引用的函数,因此不会更改new A
所发生的内容{1}}。
你可以设置A.prototype.constructor
,然后给class A
一个constructor
一个{<1}},它遵循原型上定义的那个,如果它不再是同一个函数,转发任何传递的参数。这会产生非常不寻常的类(通常,A.prototype.constructor === A
是true
),但是你需要它做什么。
const A = class {
constructor(...args) {
let Constructor = A.prototype.constructor
if (Constructor !== A) {
Constructor.apply(this, args);
}
}
};
(A.prototype.constructor = function(name) {
this.name = name;
}).prototype = A
console.log(
new A('It works!')
)
修改:另一个避免混淆A.prototype.constructor
的选项是在Constructor
上定义一个静态A
属性,您可以将其更改为喜好:
const A = class {
static Constructor = Function.prototype
constructor(...args) {
A.Constructor.apply(this, args);
}
};
A.Constructor = function(name) {
this.name = name;
}
console.log(
new A('It works!')
)