我正在使用Object.prototype扩展我的Web应用程序中的Object类,如下所示,但后端返回错误消息:the options [allFalse] is not supported

let MongoClient = require('mongodb').MongoClient;

Object.prototype.allFalse = function() {
 for (var i in this) {
   if (i < 1) return;
   if (this[i] === true) return false;
 }
 return true;
}

router.get('/getmongo', function(req, res) {
  MongoClient.connect(process.env.DB_CONN, function(err, db) {
   (bunch of codes here)
  }
}


我将代码替换为以下代码,并且效果很好。

let MongoClient = require('mongodb').MongoClient;

Object.defineProperty(Object.prototype, 'allFalse', {
  value : function() {
    for (var i in this) {
      if (i < 1) return;
      if (this[i] === true) return false;
    }
    return true;
  }
 });

 router.get('/getmongo', function(req, res) {
   MongoClient.connect(process.env.DB_CONN, function(err, db) {
    (bunch of codes here)
   }
 }


任何人都可以向我解释为什么?

最佳答案

“但是后端返回错误”……“我用以下代码替换了代码,它可以正常工作。”


不同之处在于第一个变体使allFalse属性可枚举。因此,将选项序列化的代码在发送到后端之前会以某种方式序列化allFalse属性。

考虑以下代码片段,它们伪造了可能受到第一种情况下扩展对象原型方式影响的序列化。



Object.prototype.allFalse1 = function allFalse1() {}

Object.defineProperty(Object.prototype, 'allFalse2', {
  value: function allFalse2() {}
})

const a = {a: 1}

console.log(serialize(a))

console.log(
 Object.getOwnPropertyDescriptor(Object.prototype, 'allFalse1').enumerable,
 Object.getOwnPropertyDescriptor(Object.prototype, 'allFalse2').enumerable
)


// fake serialization that traverses inherited properties
function serialize(obj) {
  const params = []

  for(const key in obj) {
    params.push(`${key}=${encodeURIComponent(obj[key])}`)
  }
  return params.join('&')
}

09-29 20:30