new.target 是构造器元属性,用于校验调用方式和控制类继承;异步 generator 才是材质派生的核心,通过分段 yield 渲染资源实现按需加载与组合。

new.target 本身不参与异步 Generator 的执行流程,也不能直接“实现”材质派生。它只是一个元属性,用于检测函数是否被 new 调用,在图形引擎中主要用于构造器校验和类继承控制;而异步 Generator(async function*)负责按需产出异步计算的材质数据(如着色器编译结果、纹理加载帧、PBR 参数流等)。二者需协同设计,而非混用或替代。
明确 new.target 的真实作用边界
在图形引擎中,new.target 常见于以下场景:
- 防止材质类被误作普通函数调用:
class BaseMaterial { constructor() { if (!new.target) throw new Error('BaseMaterial must be constructed with new'); } } - 支持子类构造器透传:子类继承时,
new.target指向实际被new的子类,可用于动态选择默认 shader 或初始化策略 - 配合
Reflect.construct()实现延迟实例化(例如在资源加载完成后再真正构建材质实例)
异步 Generator 才是材质派生的核心载体
材质派生本质是“分步获取并组合渲染资源”,适合用 async function* 表达:
- 每次
yield可返回一个中间状态:如{ type: 'vertexShader', status: 'compiled', data: compiledCode } - 可封装多阶段异步操作:GLSL 编译 → uniform 自动推导 → 纹理采样配置 → Mipmap 生成 → GPU 内存提交
- 消费者用
for await (const step of createPbrMaterialAsync())逐帧响应,便于 UI 进度反馈或热重载中断
两者如何安全协同
关键不是“用 new.target 实现 Generator”,而是让 Generator 的产出能驱动正确类型的材质实例化:
- Generator 函数内部可接收
ctor = new.target || Material作为构造器参数,确保派生材质使用调用方意图的类 - 在 Generator 的最终
yield阶段,调用Reflect.construct(ctor, [finalConfig])完成实例化,此时new.target在目标类构造器中仍有效 - 避免在 Generator 函数体顶层使用
new.target—— 它在非构造器上下文中为undefined,且 Generator 本身不可被new
典型代码结构示意
(非运行代码,仅示意协作逻辑)
class PbrMaterial extends BaseMaterial {
constructor(config) {
super(config);
// new.target 此处为 PbrMaterial,可用于差异化初始化
}
}
<p>async function* deriveMaterial(config) {
yield { phase: 'parse', progress: 0.2 };
const shader = await compileShader(config.vertex, config.fragment);</p><p>yield { phase: 'validate', progress: 0.5 };
const uniforms = inferUniforms(shader);</p><p>yield { phase: 'loadTextures', progress: 0.8 };
const textures = await Promise.all(config.textures.map(loadTexture));</p><p>// ✅ 此处才用 new.target 的语义:确保用调用方指定的类构造
const instance = Reflect.construct(
config.constructorClass || PbrMaterial,
[{ ...config, shader, uniforms, textures }]
);</p><p>yield { phase: 'ready', material: instance, progress: 1.0 };
}
</p>
不复杂但容易忽略:new.target 是构造上下文的快照,Generator 是异步流程控制器,它们在图形引擎中各司其职——前者守门,后者流水线。真正实现材质派生,靠的是 async generator 的分段产出能力,以及对 WebGL/GPU 资源生命周期的精准建模。










