能否使用OLOO模式或工厂函数模式定义静态属性或方法?
能否用OLOO或工厂函数模式定义静态属性/方法?
可以,这两种模式都能实现静态属性和方法,下面分别说明具体实现方式:
一、OLOO模式实现静态成员
在OLOO(Objects Linking to Other Objects)模式中,静态属性/方法可以直接挂载在原型对象本身上——所有实例都链接到这个原型,既可以通过原型对象直接访问,也能通过实例的原型链间接访问(更推荐直接通过原型对象访问,语义更清晰)。
基于你提供的自行车示例,我们可以添加静态成员:
let bikePrototype = { init(make, model, brand) { this.make = make; this.model = model; this.brand = brand; return this; }, info() { return `${this.brand} ::: ${this.model}`; } }; // 直接在原型对象上添加静态方法 bikePrototype.getDefaultBrand = function() { return 'KTM'; }; // 添加静态属性 bikePrototype.defaultMake = 'Basic'; // 访问静态成员 console.log(bikePrototype.getDefaultBrand()); // 输出: KTM console.log(bikePrototype.defaultMake); // 输出: Basic // 实例也能通过原型链访问(不推荐,语义不明确) let duke = Object.create(bikePrototype).init('Duke', '2020', 'KTM'); console.log(duke.__proto__.getDefaultBrand()); // 输出: KTM
如果你的运行环境支持对象字面量的static语法,也可以直接在原型对象内部声明:
let bikePrototype = { init(make, model, brand) { this.make = make; this.model = model; this.brand = brand; return this; }, info() { return `${this.brand} ::: ${this.model}`; }, // 静态方法 static getDefaultBrand() { return 'KTM'; }, // 静态属性 static defaultMake: 'Basic' };
二、工厂函数模式实现静态成员
工厂函数本质是普通函数,静态属性/方法可以直接挂载在工厂函数本身上,用法和构造函数的静态成员类似。
示例实现:
// 工厂函数 function createBike(make, model, brand) { return { make, model, brand, info() { return `${this.brand} ::: ${this.model}`; } }; } // 添加静态方法 createBike.getDefaultBrand = function() { return 'KTM'; }; // 添加静态属性 createBike.defaultMake = 'Basic'; // 使用静态成员 console.log(createBike.getDefaultBrand()); // 输出: KTM console.log(createBike.defaultMake); // 输出: Basic // 创建实例 let duke = createBike('Duke', '2020', 'KTM'); console.log(duke.info()); // 输出: KTM ::: 2020
如果工厂函数的实例通过共享原型复用方法,静态成员依然挂载在工厂函数上即可:
// 共享方法的原型对象 const bikeMethods = { info() { return `${this.brand} ::: ${this.model}`; } }; function createBike(make, model, brand) { const bike = Object.create(bikeMethods); bike.make = make; bike.model = model; bike.brand = brand; return bike; } // 静态成员挂载在工厂函数上 createBike.getVehicleType = () => 'Motorcycle'; console.log(createBike.getVehicleType()); // 输出: Motorcycle
内容的提问来源于stack exchange,提问作者noSelf_
相关产品推荐
相关产品推荐

