刚刚把一个小项目中的过程方式写的代码重构为面向对象,实现一个简单的继承关系。
关于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去访问的,因为子类已经具有了父类的全部方法。