检测对象是否使用自定义原型设计模式创建?

时间:2019-08-07 14:51:56

标签: javascript node.js ecmascript-6

我正在研究能够检测可以通过JSON作为存储向量安全地保存和恢复的所有状态变量的逻辑。

这部分意味着检测到可以“安全”转储和还原的类型,这很容易做到:

  • 数字,字符串和布尔值(通过typeof
  • 数组元素(通过instanceof Array与迭代元素中的^组合)
  • ES6类实例(通过typeof对象和value.__proto__.constructor.name

尽管有一种我在努力奋斗。这是通过调用创建的:

var nn = new convnetjs.Net();

这是从哪个来的: https://github.com/karpathy/convnetjs/blob/master/src/convnet_net.js#L8

有趣的是,Chrome开发人员工具将其检测为“净”对象: nn

如果您检查上面显示的nn变量,就会看到此内容。

这是我尝试过的:

  • nn instanceof Object ===真

  • Object.getPrototypeOf(nn)-有趣的是,这暴露了上面链接(第12行)中分配给Net.prototype的功能。好像是线索。

  • Object.getPrototypeOf(nn).toString() == [object Object]

  • Object.getPrototypeOf(nn) instanceof Object === true。有道理,因为它是包含附加到原型的自定义函数的对象。

  • Object.getPrototypeOf(nn).constructor.name === Object

有人会知道或有想法如何安全地检测这种类型的物体吗?普通对象很好,但是我不想用修改后的原型覆盖对象。

1 个答案:

答案 0 :(得分:0)

如果要使用它来验证它是纯对象还是具有自定义原型的对象:

const isPlainObject = Object.getPrototypeOf(value) === Object.getPrototypeOf({});