我是.net开发人员,尝试使用nodejs web api开发。
我想知道我们是否可以在nodejs中创建与我们在asp.net web api中创建的模型相同的模型。
例如
public class BaseResponse
{
public bool Success { get; set; }
public string ErrorMessage { get; set; }
}
public class MovieResponse : BaseResponse
{
public int MovieId { get; set; }
public string MovieName { get; set; }
}
这就是我们在c#中的表现。
如何在nodejs中创建此类模型。
任何npm包可用吗?
答案 0 :(得分:3)
有好消息,有坏消息。坏消息是类和继承的概念,因为您不支持其他语言。好消息是,JavaScript试图在这个想法上做点什么(虽然它实现了它的工作很糟糕)。以下是您使用JavaScript提供的代码示例:
function BaseResponse(success, errorMessage) {
this.success = success;
this.errorMessage = errorMessage;
}
function MovieResponse(success, errorMessage, movieId, movieName) {
BaseResponse.call(this, success, errorMessage); // Call the base class's constructor (if necessary)
this.movieId = movieId;
this.movieName = movieName;
}
MovieResponse.prototype = Object.create(BaseResponse);
MovieResponse.prototype.constructor = MovieResponse;
/**
* This is an example of an instance method.
*/
MovieResponse.prototype.instanceMethod = function(data) { /*...*/ };
/**
* This is an example of a static method. Notice the lack of prototype.
*/
MovieResponse.staticMethod = function(data) {/* ... */ };
// Instantiate a MovieResponse
var movieResInstance = new MovieResponse();
Mozilla非常好documentation on JavaScript and classes。在上面的代码中,您要创建两个函数BaseResponse
和MovieResponse
。当您使用new
关键字时,这两个函数都充当具有相应“类”的对象的构造函数。您使用MovieResponse
Object.create BaseMovie
指定MovieResponse.prototype =
继承(BaseResponse)
。这有效地将MovieResponse
的{{3}}设置为等于BaseResponse
的原型链。您会注意到在设置MovieResponse
的原型链后,我必须将其构造函数设置为指向MovieResponse
。如果我没有这样做,每次你尝试初始化MovieResponse
时,JavaScript都会尝试实例化BaseResponse
(我告诉你他们做了一件糟糕的工作)。
其余代码应该相对简单。您可以通过在原型链上定义实例方法,在全新的闪亮类上创建实例方法。如果您在BaseResponse
上定义了一个未在MovieResponse
上定义但在MovieResponse
的实例上调用该函数的函数,则JavaScript将“抓取”原型链,直到找到该函数。静态方法直接在构造函数本身上定义(另一个奇怪的特性)。
请注意,没有类型或访问修饰符(公共/私有)的概念。您可以实现运行时技巧来强制执行类型,但在JavaScript中通常不需要它,并且比添加此类检查更容易出错和缺乏灵活性。
您可以使用比类型更直接的方法来实现类的私有成员和受保护成员的概念。使用prototype chain,并假设您需要一个名为privateMethod
的私有函数,您可以将其实现为:
function privateMethod() { /* privateMethod definition */ }
// Definition for MovieResponse's constructor
function MovieResponse() { /*...*/ }
module.exports = MovieResponse;
我将添加一些我不同意的必要注释:在JavaScript中不必使用继承。 JavaScript使用的概念创造了“鸭子打字”(如果它看起来像一只鸭子,听起来像一只鸭子,它的鸭子)。由于JavaScript是弱类型的,它不关心对象是BaseResponse还是MovieResponse,您可以调用任何方法或尝试访问您想要的任何字段。结果通常是错误或错误/容易出错的代码。我在这里提到这一点是因为你可能会遇到这个概念及其支持者。知道这样的编程是危险的,并导致糟糕的编程实践。