有好消息,也有坏消息。坏消息是不支持您从其他语言中知道的类和继承的概念。好消息是,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 继承自 BaseMovie 和 MovieResponse.prototype =Object.create(BaseResponse)。这有效地将MovieResponse 的prototype chain 设置为等于BaseResponse 的原型链。您会注意到,在设置MovieResponse 的原型链之后,我必须立即将其构造函数设置为指向MovieResponse。如果我不这样做,每次你尝试初始化 MovieResponse 时,JavaScript 都会尝试实例化 BaseResponse(我告诉过你他们做得很糟糕)。
其余代码应该相对简单。您可以通过在原型链上定义它们来在全新的闪亮类上创建实例方法。如果您在BaseResponse 上定义了一个未在MovieResponse 上定义的函数,但在MovieResponse 的实例上调用该函数,JavaScript 将“爬取”原型链,直到找到该函数。静态方法直接在构造函数本身上定义(另一个奇怪的特性)。
请注意,没有类型或访问修饰符(公共/私有)的概念。您可以实施一些运行时技巧来强制执行类型,但在 JavaScript 中这通常是不必要的,而且比添加此类检查更容易出错和缺乏灵活性。
您可以用比类型更直接的方法来实现类的私有成员和受保护成员的概念。使用Node's require(),并假设您想要一个名为privateMethod 的私有函数,您可以将其实现为:
function privateMethod() { /* privateMethod definition */ }
// Definition for MovieResponse's constructor
function MovieResponse() { /*...*/ }
module.exports = MovieResponse;
我将添加一些我不同意的必要评论:在 JavaScript 中使用继承是不必要的。 JavaScript 使用了一个被称为“鸭子类型”的概念(如果它看起来像鸭子并且听起来像鸭子,那么它就是鸭子)。由于 JavaScript 是弱类型的,它不关心对象是 BaseResponse 还是 MovieResponse,您可以调用任何方法或尝试访问您想要的任何字段。结果通常是错误或错误/容易出错的代码。我在这里提到这一点是因为您可能会遇到这个概念及其支持者。知道这样的编程是危险的,并且会导致不良的编程习惯。