我有一个包含一般车辆信息的模块车辆。我有另一个模块Car,它为Vehicle对象添加了更多功能。
// Pseudo code only. The final functions do not have to resemble this
var vehicle = require('vehicle')
vehicle.terrain = 'Land'
var car = vehicle.createCar()
// car and anotherCar will have unique Car-related values,
// but will use the same Vehicle info
var anotherCar = vehicle.createCar()
我正在考虑将Object.create用于Car模块,但不确定Object.create调用的位置。
请非常感谢任何示例和最佳做法。
更新
我更改了示例以更好地反映我正在尝试解决的继承问题。
答案 0 :(得分:4)
imo,你在描述一个构建器模式而不是继承我认为 - 我不会为此使用object.create。 VehicleBuilder负责构造具有与之关联的特定属性的对象。
var builder = new VehicleBuilder();
builder.terrain = 'Land';
builder.wheelCount = 2;
builder.color = "blue";
var motorcycle = builder.createVehicle();
可能会使用以下内容:
VehicleBuilder.prototype.createVehicle = function(){
var me = this;
return new Vehicle({
color: me.color,
terrain: me.terrain,
wheelCount: me.wheelCount
});
}
如果你看一下js中的典型继承模式,它的定义要好得多,并且在节点中使用两个主要模式。一个是util.inherits。它的代码很简单:https://github.com/joyent/node/blob/master/lib/util.js#L423-428
exports.inherits = function(ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: { value: ctor, enumerable: false }
});
};
第二个是调用子类构造函数中的父构造函数。
function ChildClass(){
SuperClass.call(this); // here
}
示例:https://github.com/joyent/node/blob/master/lib/stream.js#L25-28
因此,不是在构造函数中使用一堆属性或其他对象,而是使用原型链和构造函数来定义自定义子类行为。
答案 1 :(得分:0)
我会推荐一种不同的方法
// foo.js
var topic = require("topic");
topic.name = "History";
topic.emit("message");
topic.on("message", function() { /* ... */ });
// topic.js
var events = require("events");
var Topic = function() {
};
// inherit from eventEmitter
Topic.prototype = new events.EventEmitter();
exports.module = new Topic;
你有一个很好的EventEmitter
来传递消息。我建议您只使用它扩展Topic
的原型。
答案 2 :(得分:0)
为什么不使用基于js原生原型的继承?直接使用module.exports:
公开构造函数//vehicle.js
module.exports = function() {
//make this a vehicle somehow
}
然后:
// Pseudo code only. The final functions do not have to resemble this
var Vehicle = require('vehicle')
Vehicle.terrain = 'Land'
var car = new Vehicle()
// car and anotherCar will have unique Car-related values,
// but will use the same Vehicle info
var anotherCar = new Vehicle()