Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

普通的属性可以在初始化时定义多次(例如 {a: 1, a: 2}),但是 __proto__ 只能定义一次({__proto__:{}, __proto__: {}} 是不合法的),可在此查看对比

Object 原型

空对象

往往,当我们谈及空对象时,可能指的通常是 {} —— 但它其实「没有那么空」,它存在着 Object 作为它的原型,因此实际存在着若干的属性

可以利用 console.log(Object.getPrototypeOf({})) 来查看一个空对象中所拥有的属性

...

如果我们想创建一个「真正的」空对象,需要确保它的原型也为空,可以利用 Object.create(null) 来获得它

Object 原型

JS 中基本所有的非基本类型的对象的原型最终都是 Object(可点此实验,除了 null undefined Symbol 和特意自定义了原型的对象,包括自定义类的实例、各种基础类型在内的所有对象最初始的原型都是 Object)。

因为原型是一种链式结构,而几乎所有的对象的原型链最头上都是 Object,因此 Object 的方法几乎可以被所有对象所调用(在没有被同名属性屏蔽的情况下)

可以通过 console.log(Object.prototype) 获取到 Object 原型的内容,它包括

  • 与值相关的属性 TODO

  • 与 property 相关的属性

  • 与 prototype 相关的属性

    • (已经被弃用的)__proto__ 属性,用于获取或设置 prototype(上面说过了)

    • isPrototypeOf 属性:一个函数,用于判断调用当前函数的 this 是否存在于另一个对象的原型链中

      • 使用方法应该为 A.prototype.isPrototypeOf(b),即调用 isPrototypeOf 的对象应当为一个原型对象、而它的参数应该为存在原型的对象

      • 现在通常使用 instanceof,通常A.prototype.isPrototypeOf(b) 可以被 b instanceof A 替代

Object 属性

TODO