美文网首页
const实现

const实现

作者: 达文西_Huong | 来源:发表于2020-06-17 10:42 被阅读0次

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

相关文章

  • const辨析

    const的作用:const变量,表示该变量不可修改。const成员函数,是通过const this指针隐式实现的...

  • const实现

    关于const的实现 本质: const实质上保证的,并不是变量的值不允许修改,而是变量指向的内存地址不得改动。对...

  • python实现常量const

    新建const.py: --coding:UTF-8-- Filename: const.py 定义一个常量类实现...

  • C++11:type_traits (3) type prope

    std::is_const : 判断一个类型是否有const限定。可能的实现为: 代码示例如下: std::is_...

  • js实现sku组合,商品新建SKU组合销售规格

    要求实现的功能如上: 代码如下: 实现方法1: attributeChange(){ const data= th...

  • 15/11

    类型转换运算符 dynamic_cast:派生类转成基类对象 const_cast:实现修改const修饰的对象值...

  • ES6的一些骚操作

    1、实现Array类型数据的深拷贝const newData = Array.slice();

  • 移位算法实现

    目标: 实现字符串移位加密. 缺点: 密钥传输 const DIC =':abcdefghijklmnopqrst...

  • vue路由懒加载

    实现vue路由懒加载的几种方式 [1]const home = r => require.ensure([], (...

  • CocosCreator3.x开发笔记4:enum和const

    enum实际是通过在立即执行函数内进行两次双向的赋值实现的const enum编译后并没有相关代码const en...

网友评论

      本文标题:const实现

      本文链接:https://www.haomeiwen.com/subject/jrcnzhtx.html