Node.js JavaScript创建基础模型并对其进行扩展

Node.js JavaScript创建基础模型并对其进行扩展,javascript,node.js,oop,model-view-controller,Javascript,Node.js,Oop,Model View Controller,我试图创建s基本模型并从中扩展模型,但当我调用DataModel时,它调用UsersModel的函数 这是我打电话的方式: var model = new(require('../models/DataModel')); module.exports = PrivateController.extend({ name : 'Wall', content : null, run : function(type, req, res){ model.get(function(

我试图创建s基本模型并从中扩展模型,但当我调用DataModel时,它调用UsersModel的函数

这是我打电话的方式:

var model = new(require('../models/DataModel'));

module.exports = PrivateController.extend({
name : 'Wall',
content : null,
run : function(type, req, res){        
    model.get(function(err, result){
        //WHEN THIS GETS CALLED -> DISPLAYS 'users' and should me xyz from DataModel
    }
}))

Base.js

module.exports = function(db) {
this.db = db;
};
module.exports.prototype = {
extend: function(properties) {
    var Child = module.exports;
    Child.prototype = module.exports.prototype;
    for(var key in properties) {
        Child.prototype[key] = properties[key];
    }
    return Child;
}
数据模型:

var Model = require("./Base"),
model = new Model();


var DataModel = model.extend({
    collection_name: 'xyz',
get: function(callback) {
    console.log(this.collection_name); // THIS SHOULD DISPLAY 'xyz'
}
});


 module.exports = DataModel;
不是显示数据模型集合名称,而是从这里获取:

UserModel.js

var Model = require("./Base"),
model = new Model();

var UserModel = model.extend({
collection_name: 'users',
get: function(callback, email, password) {
    console.log(this.collection_name); //DISPLAY users
},



module.exports = UserModel;

我不确定你是从哪里得到这个
extend
函数的代码的,但它是非常不正确的

我对其进行了更好的格式化,以便我们可以看到问题:

var Base = function(db) {
    this.db = db;
};

Base.prototype = {
    extend: function(properties) {
        var Child = Base; // what?
        Child.prototype = Base.prototype; // what?
        for(var key in properties) {
            Child.prototype[key] = properties[key];
        }
        return Child;
    }
};
在扩展函数中:

您正在将子对象设置为超级对象的引用,因此您正在有效地更改超级对象,因此依赖超级原型的所有其他对象都将受到影响

这可能就是您想要做的:

var Base = function(db) {
    this.db = db;
};

Base.prototype = {
    extend: function(properties) {
        var Child = function(){
            Base.apply(this, arguments);
        };
        Child.prototype = Object.create(Base.prototype);
        for(var key in properties) {
            Child.prototype[key] = properties[key];
        }
        return Child;
    }
};

对于node.js中的继承,我个人只会坚持。继续阅读以查看更多继承示例。

我通过将行“Child.prototype=module.exports.prototype”更改为“Child.prototype=new module.exports(this.db)”,成功地将其付诸实施。。。现在看起来正确吗?顺便说一下,这里的代码是:是的,
Child.prototype=new module.exports(this.db)
可以工作,但它也会执行超级构造函数,您只想在创建新实例时执行,而不是在扩展时执行。这就是为什么要使用
对象。创建
而不是。顺便说一句,那篇文章在我看来完全是垃圾。他的扩展代码和测试都很糟糕。说真的,伙计,不要看那篇文章。它充满了失败,会让你困惑。哈哈,谢谢我做了我的第一个nodejs项目,但我不是完全遵循它,只是采取了“基本控制器”和“基本模型”的想法…如果你有任何好的参考资料(更好的例子),请给我看