...
普通的属性可以在初始化时定义多次(例如 {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 相关的属性
(已被弃用的)__defineGetter__ 和 __defineSetter__ 属性用于为对象定义 getter 和 setter,现已建议用 Object.defineProperty 来替代
(已被弃用的)__lookupGetter__ 和 __lookupSetter__ 属性用于获取给对象定义的属性,现已建议用 Object.getOwnPropertyDescriptor 替代
hasOwnProperty 属性函数用于判断对象是否存在某一自有属性
自有属性的含义:是属于这个对象的,而不是属于其原型链上的
与 in 不同:in 会检查所有原型链上的继承属性,而 hasOwnProperty 不会检查原型链
现在已建议使用 Object.hasOwn 来替代
propertyIsEnumerable 属性函数用于判断对应的属性是否为自有属性 + 可枚举属性
虽然函数命名上仅展示了可枚举性,但实际上只有同时为自有属性该函数才会返回 true
关于可枚举属性的含义:各种对象的属性后面会具体再写,简单说就是可以被循环到的属性,可阅读文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties 详细了解
可利用 Object.getOwnPropertyDescriptor + 判断返回的 enumerable 属性来替代
与 prototype 相关的属性
(已经被弃用的)__proto__ 属性,用于获取或设置 prototype(上面说过了)
isPrototypeOf 属性:一个函数,用于判断调用当前函数的 this 是否存在于另一个对象的原型链中
使用方法应该为
A.prototype.isPrototypeOf(b)
,即调用isPrototypeOf
的对象应当为一个原型对象、而它的参数应该为存在原型的对象现在通常使用
instanceof
,通常A.prototype.isPrototypeOf(b)
可以被b instanceof A
替代
Object 属性
TODO