我正在尝试创建一个函数Vector
,该函数需要一个数字n
并返回类型Vector[n]
:
let Vector = n => {
const result = function(...vals) {
this._data = Array(n).fill(0).map((_, i) => vals[i] || 0)
Object.assign(this, this._data.reduce((a, c, i) => ({ ...a, ['v' + i]: c }), {}));
}
result.prototype.add = function(v) {
return new result(...this._data.map((x, i) => x + v._data[i]));
}
return result;
}
效果很好:
let Vec2 = Vector(2);
let v1 = new Vec2(0, 1);
let v2 = v1.add(new Vec2(1, 2))
console.log(v2);
记录的值如下:
result {_data: Array(2), v0: 1, v1: 3}
一切正常,但类型名称为'result'。在这种情况下,我宁愿将其命名为“ Vector2”。我该怎么办?
我试图通过将result
替换为this['Vector' + n]
来创建动态名称,但结果是:
Vector.(anonymous function) {_data: Array(2), v0: 1, v1: 3}
我还尝试分配result.name
和result.prototype.name
,但均未按预期工作。
是否可以在Javascript中重命名动态创建的类型?
答案 0 :(得分:1)
使用new Function()
或eval()
并将逻辑包含在模板字符串中是可行的。
检查this answer,以获取有关动态函数名称的更多信息。
let Vector = n => {
const name = 'Vec' + n;
return new Function(`return function ${name}(...vals) {
this._data = Array(${n}).fill(0).map((_, i) => vals[i] || 0)
Object.assign(this, this._data.reduce((a, c, i) => ({ ...a, ['v' + i]: c }), {}));
this.add = function(v) {
return new ${name}(...this._data.map((x, i) => x + v._data[i]));
}
}`)()
}
const Vec2 = Vector(2);
const Vec3 = Vector(3);
const vec2 = new Vec2(0, 1);
const vec3 = new Vec3(0, 1, 2);
console.log(vec2 instanceof Vec2);
console.log(vec3 instanceof Vec3);
console.log(Vec2.name, Vec3.name);
console.log(vec2.add(new Vec2(1, 2)));
console.log(vec3.add(new Vec3(1, 2, 3)));
答案 1 :(得分:-1)
您的Vector
函数返回一个匿名函数。
如果您将其命名,则Chrome devtools将使用该名称。
每个环境对此都有不同的对待。 请考虑以下代码段:
const test = function OldName(){}
Object.defineProperty(test, 'name', {value: 'NewName'})
console.log(new test())
一种可能的解决方案是使用Function
构造函数(new Function()
):
const vector = n => new Function(`return function Vector${n}(){}`)()
const test = vector(3)
console.log(new test())
这会在Chrome中正确记录。