继承类方法Javascript

时间:2017-07-08 22:37:19

标签: javascript inheritance

假设我有两个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不存在。

我知道我只是继承了原型属性,但我找不到在任何地方继承类方法的例子。

2 个答案:

答案 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编译器也可以告诉你,你不仅可以随意乱搞一些函数的原型,而且可能会破坏某些东西或做某些事情,而且很奇怪"。