const实现

2020-06-17  本文已影响0人  达文西_Huong

关于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

上一篇 下一篇

猜你喜欢

热点阅读