gpt4 book ai didi

node.js - 如何在 Node.js 的模块内使用 Object.create 进行继承

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:35 25 4
gpt4 key购买 nike

我有一个包含一般车辆信息的车辆模块。我有另一个模块 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 调用应该去哪里。

  • 我是否应该在 Car 模块中使用一个构造函数来获取 Vehicle 对象的实例,并以该 Vehicle 实例作为原型(prototype)执行 Object.create?
  • 或者 Object.create 应该发生在 Vehicle 对象的函数中,比如 createCar?我对这种方式的问题是,汽车应该关心它是从车辆派生的,车辆不应该知道汽车需要这一点。
  • 或者即使 Object.create 是正确的方法。

请提供任何示例和最佳实践,我们将不胜感激。

更新:

我更改了示例以更好地反射(reflect)我正在尝试解决的继承问题。

最佳答案

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 中的典型继承模式,您会发现它的定义更加明确,并且在 Node.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

因此,您可以使用原型(prototype)链和构造函数来定义自定义子类行为,而不是让车辆在其构造函数中获取一堆属性或另一个对象。

关于node.js - 如何在 Node.js 的模块内使用 Object.create 进行继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6093327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com