javascript - 原型传参和直接传参的区别
阿神
阿神 2017-04-11 11:31:57
[JavaScript讨论组]

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

先上代码

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对象不会报错。

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

阿神
阿神

闭关修行中......

全部回复(1)
PHP中文网

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号