关于const的实现
本质:
const实质上保证的,并不是变量的值不允许修改,而是变量指向的内存地址不得改动。对于简单的数据类型(字符串,数字,布尔值),值就保存在内存地址中,因此等同于不能改变
但对于复合类型的数据,因为变量指向的内存地址保存的只是一个指针,const 只能保证指针的不变,但是不能保证指针指向的复合类型的数据结构不可变。
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
实现:
下面代码模拟了const的实现
function myConst (key, val) {
window.key = val
Object.defineProperty(window,key, {
enumerable:false,
configurable: false,
get: ()=>{
return val
},
set: (value)=>{
if(value != val){
throw new TypeError('不能重复定义')
}else{
return val
}
}
})
}
myConst('a',2)
console.log(a) // 2
a = 10 // Uncaught TypeError: 不能重复定义
补充:
关于Object.defineProperty有以下的一些扩展信息
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。(备注:应当直接在Object构造器中直接调用,而不是任意object类型上调用)
语法: Object.defineProperty(obj, prop, descriptor)
obj: 需要被操作的目标对象
prop: 目标对象需要定义或修改的属性的名称
descriptor: 将被定义或修改的属性的描述符
configurable: 该属性的描述符(key)是否可以被改变或删除(false)
enumerable : 是否可枚举 (false)
数据描述符还具备以下选值:
value
: 属性对应的值(任何有效的js的值)
writable
: 是否允许value的值被赋值运算符改变
get
: getter函数,当访问该属性时,会调用此函数,该函数的返回值会被用作属性的值
set
: setter函数,当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值)
学习参考链接:
官方传送门
https://www.cnblogs.com/minigrasshopper/p/9144223.html
网友评论