原型传参和直接传参的区别

不知道这样问是不是正确。

先上代码

user.js

var baseDao = require('../dao/baseDao');

function User(user) {
  this.ID = user.ID || null;
  this.CODE = user.CODE  || null;
  this.NAME = user.NAME  || null;
}

User.prototype = baseDao;
User.prototype.table_name = 'user';

module.exports = User;

baseDao.js

// Sql builder
var squel = require('squel');
// DB ThreadPool
var pool = require('../tool/DB');

// 错误用法
// function save(callback) {
//    var ob = this;
function save(ob, callback) {
  var sql = squel.insert()
    .into(table_name)
    .setFields(ob)
    .toString();
  pool.getConnection(function (err, conn) {
    if (err) {
      return callback(err);
    }
    conn.query(sql, function (err) {
      conn.release();
      if (err) {
        return callback(err);
      }
      callback(null)
    });
  });
}
...

route.js

...
var User = require('../src/user');
...
router.post('/profile', function (req, res, next) {
    var user = JSON.parse(req.body.user);
    // save
    var _user = new User(user);
    _user.save(user, function (err) {
      ...
    })
});

调用关系 router.js -> user.js -> baseDao.js

squel.js 是封装mysql驱动的模块。

问题出在 .setFields(ob) 这个地方,错误信息

Error: field value must be a string, number, boolean, null or one of the registered custom value types

官方文档给出的用法如下:

    squel.insert()
        .into("students")
        .setFields({ name: "Thomas", age: 29 })
        .toString()

我觉得我的调用没有问题

两种调用方式在 baseDao.js 的save 中方法中使用 JSON.stringify() 打印出的对象是完全一致的。

但是直接使用(注释掉的部分是报错的情况)this会报错, 直接传ob对象不会报错。

一定是哪里用错了,恳请指正!

阅读 2.8k
1 个回答

自己来答一下,原因在 .setFields 方法遍历了传入的属性,由于原型链的作用,一些不相关的属性也遍历出来了,比如 baseDao.save 方法,JSON.stringify 只能检测两个对象本身,原型链上的引用是不考虑的。

姑且使用的时候用JSON.stringify之后再parse回来的方法解决一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题