假设我有两个API,我想从第一个继承类,但是使用.prototype.toJSON()修改响应。
当我从第一个类继承时,我如何继承类方法。
一个例子
//file v1/models/users.js
var UserModel = function() {
this.id = 0;
this.firstName = '';
this.lastName = '';
}
UserModel.find = function(q, callback) {
//find any user that matches q and map them to UserModel
if (err) return callback(err, null);
callback(null, users);
}
module.exports = UserModel;
下一个版本
//file v2/models/users.js
var UserModel = require('../v1/models/users');
function UserModelV2() {
UserModel.call(this);
}
UserModelV2 = Object.create(UserModel.prototype);
UserModelV2.prototype.constructor = UserModel;
UserModelV2.prototype.toJSON = function() {
var obj = {};
obj.firstName = 'foo';
return obj;
}
module.exports = UserModelV2;
我现在试着打电话
var User = require('./v2/models/users');
User.find(1);
我收到一条错误消息,说User.find不存在。
我知道我只是继承了原型属性,但我找不到在任何地方继承类方法的例子。
答案 0 :(得分:3)
不要将find
直接添加到UserModel
,因为这会导致该方法仅添加到一个实例。
将其添加到原型中:
UserModel.prototype.find = function(id) {
//find the user by id and return
}
因为UserModel
的所有实例都将继承构造函数的原型。
然后,你的下一个版本将继承第一个版本:
// Constructor of sub-class
function UserModelV2() {
// Call the prototype.constructor, not just .constructor
UserModel.prototype.constructor.call(this);
}
// Perform inheritance
UserModelV2.prototype = new UserModel();
// Correct the constructor of the prototype
UserModelV2.prototype.constructor = UserModelV2;
// Extend the sub-class
UserModelV2.prototype.toJSON = function() {
var obj = {};
obj.firstName = 'foo';
return obj;
}
顺便说一下(这可能就是为什么你会坚持这个),技术上(尽管有class
关键字),JavaScript没有类,它有原型,它们是继承的基础。 / p>
答案 1 :(得分:0)
好吧,您只需从UserModel
Object.assign(UserModelV2, UserModel);
或者您定义UserModelV2
函数直接从UserModel
函数而不是Function.prototype
继承其属性。
Object.setPrototypeOf(UserModelV2, UserModel);
或者您使用新的class
语法并让它来处理:
class UserModelV2 extends UserModel {
toJSON(){
return {firstName: 'foo'};
}
}
如果您需要向后兼容性,可能会与像babel这样的转换器结合使用。
我鼓励最后一个选择。对我来说,这似乎是最干净的方法,并为您提供不使用转换器的能力。
它在语义上很清楚。即使是JS编译器也可以告诉你,你不仅可以随意乱搞一些函数的原型,而且可能会破坏某些东西或做某些事情,而且很奇怪"。