如何在JavaScript伪经典继承中为构造函数设置静态属性/方法(不使用class语法)
如何在JavaScript构造函数中添加静态属性/方法(不使用class语法)
你给出的示例之所以返回undefined,是因为你在构造函数内部直接写isEdible = true时,这个变量要么是全局变量(非严格模式下),要么会报错(严格模式下),根本没和Food构造函数本身产生关联。
要实现类似Array.of()这种无需实例化就能访问的静态成员,核心逻辑很简单:构造函数本身就是一个Function对象,直接给它添加属性或方法即可——这也是Array.of、Array.from这类内置静态方法的实现方式。
1. 添加静态属性
直接在构造函数外部,把属性挂载到构造函数本身:
function Food() { // 这里可以定义实例属性,比如 this.name = name; } // 静态属性:直接赋值给Food构造函数 Food.isEdible = true; console.log(Food.isEdible); // true
2. 添加静态方法
同样把函数挂载到构造函数上,就能像Array.of()那样直接调用:
// 给Food添加静态方法,模拟Array.of的功能:批量创建实例 Food.create = function(...items) { return items.map(item => { const food = new Food(); food.name = item; return food; }); }; // 无需new Food,直接调用静态方法 const fruits = Food.create('apple', 'banana', 'orange'); console.log(fruits[0].name); // apple
原理说明
JavaScript里的构造函数本质是Function类型的实例,它本身就是一个可操作的对象。挂载在构造函数上的属性/方法,属于构造函数自己,而不是它的prototype原型对象,因此不需要通过new实例化就能直接访问——这就是静态成员的本质,和内置的Array.of完全一致。
内容的提问来源于stack exchange,提问作者freddie_ventura
相关产品推荐
相关产品推荐

