每个JS 对象都有很多内部属性和方法,仅供 JS 引擎管理和操作对象使用,对开发者不可见,只能用特殊的方法访问和修改(不建议修改)
了解它们可以帮助我们更好的理解对象的行为,无需深究其具体实现
下文中,[[]]
只是表示其为内部属性/方法,不能在代码中使用
内部属性
[[Prototype]] 对象的原型
js
// 访问 [[Prototype]] 的方法
Object.getPrototypeOf(目标对象) // 得到该对象的原型,如 Object.prototype
[[Class]] 对象的类型
js
// 访问 [[Class]] 的方法
Object.prototype.toString.call(目标对象) // 得到该对象的类型,如'[object Object]'
【应用】获取任意变量的数据类型
js
/**
* 获取任意变量的类型
*
* @param x 变量
* @returns 返回变量的类型名称(小写字母)
*/
function getType(x) {
// 获取目标数据的私有属性 [[Class]] 的值
const originType = Object.prototype.toString.call(x); // 以字符串为例:'[object String]'
// 获取类型属性值中' '的下标
const spaceIndex = originType.indexOf(" ");
// 截取类型属性值中' '到末尾']'之间的字符串
const type = originType.slice(spaceIndex + 1, -1); // 以字符串为例:'String'
// 将字符串转换为小写
return type.toLowerCase(); //以字符串为例:'string'
}
[[Extensible]] 对象是否可扩展
即,是否可以添加新属性,默认为 true
js
// 访问 [[Extensible]] 的方法
Object.isExtensible(目标对象) // true
阻止对象添加新属性
js
Object.preventExtensions(目标对象) // [[Extensible]] 变为false
内部方法
内部方法是JavaScript引擎的内部实现细节,因此它们的具体实现和名称可能会因不同的JavaScript引擎而异。
[[Get]]
获取对象属性的值
通过 obj.prop 或 obj["prop"] 获取对象属性值时,JS 引擎内调用此方法
[[Put]]
设置对象属性的值
通过 obj.prop = value 或 obj["prop"] = value 修改对象属性值时,JS 引擎内调用此方法
[[HasProperty]]
检查对象是否包含某个属性
使用 in 操作符或 Object.hasOwnProperty() 等方法来检查对象是否包含某个属性时,JS 引擎内调用此方法
[[Delete]]
删除属性
delete 操作符删除对象属性时,JS 引擎内调用此方法
[[DefineOwnProperty]]
在对象上定义或修改属性
使用 Object.defineProperty() 方法来定义或修改对象的属性时,JS 引擎内调用此方法
[[Enumerate]]
枚举对象的属性