命名动态创建的javascript类型[重复]

问题描述 投票:3回答:2

我正在尝试创建一个函数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}

这一切都按预期工作,除了类型的名称是'结果'。在这种情况下,我宁愿将它命名为'Vector2'。我怎么能这样做?

我试图通过用result替换this['Vector' + n]来创建一个动态名称,但结果如下:

 Vector.(anonymous function) {_data: Array(2), v0: 1, v1: 3}

我也尝试过分配result.nameresult.prototype.name,但都没有按预期工作。

是否可以在Javascript中重命名动态创建的类型?

javascript prototype anonymous-types
2个回答
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
投票

你的Vector函数返回一个匿名函数。 如果您给它命名,Chrome devtools将使用该名称。

每种环境都以不同的方式处理。请考虑以下代码段:

const test = function OldName(){}
Object.defineProperty(test, 'name', {value: 'NewName'})
	
console.log(new test())

Chrome记录'OldName': enter image description here

Firefox记录'对象': enter image description here

Node.js记录'NewName': enter image description here

一种可能的解决方案是使用Function构造函数(new Function()):

const vector = n => new Function(`return function Vector${n}(){}`)()
const test = vector(3)

console.log(new test())

这会在Chrome中正确记录。

© www.soinside.com 2019 - 2024. All rights reserved.