NodeJs -JavaScript 面向对象编程-关于继承的简单实现

刚刚把一个小项目中的过程方式写的代码重构为面向对象,实现一个简单的继承关系。


关于JavaScript 中原型继承我这里不多说,概念的东西我也不多重复。总是继承实现的核心就是prototype (原型)

贴出Node 中的部分代码希望大家可以理解我会对代码部分做出解释

exports = module.exports = database;

function database() {

};

/**
 * @name 获取查询集合的句柄,用来执行查询或者非查询语句
 * @param collection 集合名称
 * @param callback  回调函数
 */
database.prototype._query = function (collectionname, callback) {
    pool.acquire(function (err, db) {
        db.collection(collectionname, function (err, collection) {
            if (err) callback(err) || console.log(err);
            callback(err, collection);
        });
    });
}
/**
 * @name f返回所有匹配数据
 * @param collectionname
 * @param params
 * @param callback
 */
database.prototype.findAll = function (collectionname, params, callback) {
    if (typeof  params === 'function') {
        callback = params;
        params = null;
    }
    if (typeof params === 'object' && params) {
        if ('_id' in params) {
            params._id = new ObjectID(params._id);
        }
        params = jsontools.delnull(params);//此处为删除params中元素为null || '' || undefined 也就是没有直接存在意义的元素
    }
    this._query(collectionname, function (err, collection) {
        collection.find(params).toArray(function (err, result) {
            callback(err, result);
        });
    });
}

/**
 * @name f返回第一条匹配数据
 * @param collection
 * @param params
 * @param callback
 */
database.prototype.find = function (collectionname, params, callback) {
    if (typeof  params === 'function') {
        callback = params;
        params = null;
    }
    if (typeof params === 'object' && params) {
        if ('_id' in params) {
            params._id = new ObjectID(params._id);
        }
        params = jsontools.delnull(params);//此处为删除params中元素为null || '' || undefined 也就是没有直接存在意义的元素
    }
    this._query(collectionname, function (err, collection) {
        collection.findOne(params, function (err, result) {
            callback(err, result);
        });
    });
}
这是访问数据库基类代码,我设计中所有的业务层需要继承database 来访问数据库。(将来不排除引入配置文件通过自主配置使用自定义类来实现数据库访问同时达到不同类型数据库切换)

/**
 * 引入Dao层
 * @type {database|exports}
 */
var database = require('../../data/database');

/**
 * 声明类
 */
function usersinfo() {
    //process.env.MESSAGE_CONF zi自定义配置文件
    /**
     * 必须属性指定集合名称
     * @type {string}
     */
    this._collectionname = 'user';

    /**
     * 声明集合结构
     * @type {{fname: string, password: string}}
     */
    this.schema = {
        fname: '',
        password: ''
    };
    /**
     * 注入Dao层对象
     * @type {Function}
     */
    this.dao = Object.getPrototypeOf(this).__proto__;
}

usersinfo.prototype = new database();
exports = module.exports = new usersinfo();


usersinfo.prototype.find = function (callback) {
    this.dao.find(this._collectionname, callback);
}
usersinfo.prototype.querybyname = function (callback) {
    this.dao.find(this._collectionname, this.schema, callback);
}
业务层 直接将基类database 的原型链连向业务层userinfo类,通过 Object.getPrototypeOf(this).__proto__ 直接访问父类中的方法(重名情况可以通过此方法区分)。
usersinfo.prototype = new database();
通过原型链连向子类时 子类已经具有全部父类方法,也就是说如果访问的方法在子类中不存在那么你也是可以直接通过this去访问的,因为子类已经具有了父类的全部方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值