POJO(Plain Old JavaScript Object)是什么
原文:What is a Plain Old JavaScript Object (POJO)?
POJO是JavaScript存储用户输入数据最常用的方式,如何确切定义POJO呢?
关于JavaScript的POJO是什么有很多讨论:StackOverflow上有人认为任何包含用户数据的类都是POJO,而一个流行的npm包把POJO定义为原型是Object.prototype
的任何对象。
直观的看待POJO,它其实是只包含数据的对象,没有方法和内部状态。大部分JavaScript代码将用花括号{}
创建的对象视为POJO。而有些更严格的代码会用Object.create(null)
来创建POJO,避免从内置的Object
类继承其他属性。
1 | // 如果用`{}`创建对象`obj`,`obj`是`Object`类的实例 |
POJO和Map
JavaScript的Map
可以替代POJO用于存储数据,因为它不从Objec
t类继承属性。然而对象比Map
更容易操作,因为并非所有的JavaScript函数、框架和库都支持Map
。例如JSON.stringify()
函数不支持序列化Map
。
1 | const map = new Map([['answer', 42]]); |
检查对象是否POJO
检查一个对象是否是POJO有一些棘手,还要考虑Object.create(null)
创建的对象是不是POJO。最安全的方法是用Object.getPrototypeOf()
函数比较对象的原型。
1 | function isPOJO(arg) { |
例如,以下是Mongoose内部的isPOJO()
函数:
1 | exports.isPOJO = function isPOJO(arg) { |
Mongoose没有用proto.constructor === Object
,而是检查constructor.name
属性,这样可以支持Node.js的vm
模块生成的对象。
1 | const obj = require('vm').runInNewContext('({})'); |