【问题标题】:Is there a common term/name to Object.__proto__.__proto__ object in Javascript?Javascript 中 Object.__proto__.__proto__ 对象是否有通用术语/名称?
【发布时间】:2016-12-01 02:05:14
【问题描述】:

我一直在玩和研究 Javascript 中的 prototype chain,这个主题让我想知道......是否有一个通用名称或术语来指代原型链末尾的所有其他对象?

我在 GitHub repo of mine 上写了一个降价文件,我把它称为“上帝”对象。但我不太确定这个对象的行为方式。

例如,我是否可以将一种特定类型的对象(比如说,Dog 对象)的引用更改为拥有自己的“上帝”,还是会被这个单一的“上帝”对象卡住?

【问题讨论】:

  • 所有其他原型的最终原型是 Object.prototype。理论上,您可以通过 Object.create(null) 制作一个没有原型的对象,这可以用来形成不源自 Object.prototype 的第二个原型链 - 但不要这样做,这不是一个好主意。跨度>
  • 原因是很多代码会假设对象具有最终是原型属性的某些方法 - 特别是 .hasOwnProperty() 或 .toString() - 如果你传递了一个没有' t 继承自 Object.prototype,否则会在健壮的代码中生成异常。
  • 对了,别忘了Object其实是一个函数(可以作为构造函数),所以Object.__proto__ === Function.prototype
  • 请不要使用__proto__,它已被弃用。你应该使用Object.getPrototypeOf(Object.getPrototypeOf(Object))
  • @PMV 有人会争辩说,依赖于所有具有.hasOwnProperty.toString 属性(以及它们的值是某些函数)的对象的代码被破坏了。需要修正的是这个错误的假设,而不是创建非常规对象的代码。

标签: javascript ecmascript-6 prototype ecmascript-5


【解决方案1】:

您所指的“上帝”对象是Object.prototype

console.log({}.__proto__ === Object.prototype);
console.log({}.__proto__.__proto__);

如果你想创建自己的“上帝”对象,请使用Object.create(null)

var obj = Object.create(null);
console.log(obj.__proto__);

常用于创建查找表时,避免与原型中的字段发生名称冲突,如toString

function Map() {
  var table = Object.create(null);
  return {
    put: function(key, val) {
      table[key] = val;
    },
    get: function(key) {
      return table[key];
    }
  };
}
var map = new Map();
console.log(map.get('toString'));
map.put('toString', 'test');
console.log(map.get('toString'));

【讨论】:

  • “创建查找表时常用”---你能详细说明一下吗?
  • @zerkms 我不确定要详细说明什么,但我可以给你看一个例子like this one
  • 是的,我现在明白了。虽然无法从您在答案中的解释中推断出它:-)
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 2015-12-24
  • 2015-05-25
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多