1

我有一個模塊車輛,其中包含一般車輛信息。我有另一個模塊Car,它爲Vehicle對象添加了更多的功能。如何使用Object.create繼承node.js中的模塊

// 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調用應該去哪裏。

  • 我應該在Car模塊中有一個構造函數,它需要一個Vehicle對象的實例並以Vehicle實例爲原型執行Object.create?
  • 還是應該Object.create發生在Vehicle對象的函數中,比如createCar?我的問題是,汽車應該關心它是從車輛派生出來的,汽車不應該知道汽車需要這樣做。
  • 或即使Object.create是正確的方法。

請大家非常感謝任何示例和最佳實踐。

更新:

我改變了例子,以更好地反映我試圖解決繼承問題。

回答

4

海事組織,你描述一個生成器模式而不是繼承我想 - 我不會用的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

因此,而不是車輛採取了一堆的屬性或在其構造另一個對象,可以使用原型鏈和構造來定義自定義子類的行爲。

+0

感謝您的樣品。我結束了與util.inherits,但喜歡建設者的想法。 – baalexander 2011-05-28 04:16:31

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的原型。

+0

我改變了我的例子,以更好地反映我想要實現的基本繼承以及如何使用Object.create。最初的主題/發佈/訂閱示例與節點的事件發射概念過於混淆。 – baalexander 2011-05-23 15:26:18

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() 
+0

不是。你只是把所有的車輛變成了陸地車輛,而不僅僅是汽車。 – 2013-03-14 22:47:38

+0

這個問題並沒有表明車輛不應該都是陸地車輛。就此而言,你對Vehicle.terrain甚至做了很多假設。 – 2013-04-08 16:26:26