我正在使用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('&')
}