我们都听说过数据类型或者引用类型,那你有听过属性类型吗?我也是看了JS高程才知道的,虽然平时见的真的挺少,那对于理解这门语言真的有很大的帮助,其实属性这个概念一般都是讲对象的时候才用到,而且也有没特别关注属性还有类型这门事,好了闲话不多,我们一起来玩玩这个神奇的东西。
ECMA-262描述道:
ECMA-262 第5 版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征。
ECMA-262 定义这些特性是为了实现JavaScript 引擎用的,因此在JavaScript 中不能直接访问它们。
也就是说,我们直接通过一个点运算符来访问它们,那这些属性到底是啥呢,怎么访问呢?
属性类型分为以下两种:
数据属性
数据属性包含一个数据值的位置。在这个位置可以读取和写入值
数据属性有四个描述其行为的特性,放在了两对方括号中,表示是不可直接访问的。
[[Configurable]]
:可以通过delete删除的属性,默认为true[[Enumerable]]
:可枚举的属性,也就是可以通过for-in循环遍历出来的属性,默认true[[Writable]]
:可写的属性,也就是可以修改属性,默认true[[Value]]
:属性的值。默认为undefined
那怎么来验证呢,一般来说我们创建对象是没法看到这些属性的,ES5中提供了一个方法:
Object.defineProperty()
MDN描述道:
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
方法接受三个参数:属性所在的对象、属性的名字和一个描述符对象(descriptor
)
下面我新建一个字面量对象:
const obj = {
name: 'laocao',
age: 18,
sex: 'male'
};
Object.defineProperty(obj, 'name', {
configurable: false,
writable: false,
enumerable: false
});
delete obj.name;
console.log(obj.nam