首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

彻底搞懂Object.defineProperty

在面试时有时候会被问到,const声明的变量是否可修改,准确来说可以改,分两种情况: // 值为基本类型 const a = 1; a = 2;// 报错 // 值为复杂类型 const b = [1...说直白点,存取描述符给了我们赋值/取值时数据劫持的机会,也就就是在赋值与取值时能自定义做一些操作, getter函数在获取属性值时触发,注意,是你为某个属性添加了getter在获取这个属性才会触发,如果未定义则为...一开始没定义set默认为undefined Object.defineProperty(o, 'name', { set() {} }); //尝试再定义get,报错,已经定义过了 Object.defineProperty...我们在前面已经说了各个属性是有默认值的,所以在用Object.defineProperty()时某个属性没定义不是代表没用这条属性,而是会用这条属性的默认值。...补充 关于上面这道题,考察的虽然是Object.definedProperty的getter与setter,不过出题人的本意不是希望这么用的,任何对象在定义时候可以添加get,set方法,比如: let

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    彻底搞懂 Object.defineProperty

    在面试时有时候会被问到,const声明的变量是否可修改,准确来说可以改,分两种情况: // 值为基本类型 const a = 1; a = 2;// 报错 // 值为复杂类型 const b = [1...说直白点,存取描述符给了我们赋值/取值时数据劫持的机会,也就就是在赋值与取值时能自定义做一些操作, getter函数在获取属性值时触发,注意,是你为某个属性添加了getter在获取这个属性才会触发,如果未定义则为...一开始没定义set默认为undefined Object.defineProperty(o, 'name', { set() {} }); //尝试再定义get,报错,已经定义过了 Object.defineProperty...我们在前面已经说了各个属性是有默认值的,所以在用Object.defineProperty()时某个属性没定义不是代表没用这条属性,而是会用这条属性的默认值。...补充 关于上面这道题,考察的虽然是Object.definedProperty的getter与setter,不过出题人的本意不是希望这么用的,任何对象在定义时候可以添加get,set方法,比如: let

    79320

    【精品转载】学习 Vue 源码的必要知识储备

    null void( 对应 undefined ) 在定义变量的同时在关键的地方声明类型,使用如下: let str:string = 'str'; // 重新赋值 str = 3 // 报错 复杂类型检测...Flow 支持复杂类型检测,有如下几种: Object Array Function 自定义的 Class 需要注意直接使用 flow.js,JavaScript 是无法在浏览器端运行的,必须借助 babel...其实 Vue 的双向绑定机制采用数据劫持结合发布/订阅模式实现的: 通过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调...Object.create) { Object.create = function (o) { function F() {} // 定义了一个隐式的构造函数...不过有一点我需要在说一篇,这篇文章的定位并不是面面俱到的将所有知识都讲一遍,现实我也没这个能力。

    69830

    【前端词典】学习 Vue 源码的必要知识储备

    ( 对应 undefined ) 在定义变量的同时在关键的地方声明类型,使用如下: let str:string = 'str';// 重新赋值str = 3 // 报错 复杂类型检测 Flow 支持复杂类型检测...其实 Vue 的双向绑定机制采用数据劫持结合发布/订阅模式实现的: 通过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调...Object.create) { Object.create = function (o) { function F() {} // 定义了一个隐式的构造函数...function add(num){ var sum=0; sum= sum+num; return function tempFun(numB){ if(arguments.length...不过有一点我需要在说一篇,这篇文章的定位并不是面面俱到的将所有知识都讲一遍,这不现实我也没这个能力。

    79930

    Kotlin for Java Developers 学习笔记

    accessor 如果没有为属性定义 accessor,那么会有默认的 getter 和 setter 在类的内部,className.valueNale 的代码将由编译器决定是否对齐进行优化,如果访问非常简单...getter,所以每一次都会访问计算 接口中的属性 接口中的属性不是 final 的,它们可以被子类修改 如果任意一个子类中有自定义的 getter,那么不可以使用智能类型转换(即 if (session.user...是单例 可以把 object 放在 class 内部作为嵌套 常量 const 用来定义基本类型或者 string,这个常量会在编译时被替换掉 const cal answer = 42 泛型 interface...let { sendEmailTo(it) } 如果任意一个子类中有自定义的 getter,那么不可以使用智能类型转换(即 if (session.user is FacebookUser) 会被编译器报错...),因为自定义的 getter 可能每一次返回的是不同的值,可以通过引入一个本地变量来使用智能类型转换,而 let 可以简化这个写法 interface Session { val user:

    1.8K10

    delete的奇怪行为

    .原因分析 delete报错 记得delete操作符的规则是:成功delete返回true,否则返回false 无论成功删除了没,应该不会报错才对。...另外writable没了,因为定义getter/setter后是否可写取决于gettter/setter的具体实现,一眼看不出来了(比如setter丢弃新值,或者getter返回不变的值,效果都是不可写...false// 能删掉var声明的变量 eval('var evalX = 1'); delete evalX === true // 属性不一定能删掉 var arr = []; delete arr.length...:通过声明创建的变量和函数带有一个不能删的天赋,而通过显式或者隐式属性赋值创建的变量和函数没有这个天赋 内置的一些对象属性也带有不能删的天赋,例如: var arr = []; delete arr.length...活动对象身上没有这个属性,return true 如果属性存在,但有不能删天赋,return false 否则,删除属性,return true 所以: delete 1 === true 基本值第一步就true了,反正删没删也不知道

    2.3K30

    vue面试被问到Composition-API响应式包装对象原理

    函数入口会检查类型,首先调用isPlainObject检查是否是对象。如果不是对象,将会直接返回该参数,因为非对象类型并不可观察。...(target); // 遍历对象本身的可枚举属性,这里注意:通过def方法定义的Symbol标记并非可枚举属性 for (let i = 0; i length; i++) {...const keys = Object.keys(target);// 遍历对象本身的可枚举属性,这里注意:通过def方法定义的Symbol标记并非可枚举属性for (let i = 0; i length...= property.set; // arguments.length === 2表示没有传入val参数,并且不是readonly对象,这时该属性的值:响应式对象的属性可以直接取值拿到 /...getter || setter) /* not only have getter */ && arguments.length === 2) { val = target[key];

    64940

    「源码级回答」大厂高频Vue面试题(上)

    其实默认Vue在初始化数据时,会给data中的属性使用Object.defineProperty重新定义所有属性,当页面取到对应属性时。...getter || setter) && arguments.length === 2) { val = obj[key] } let childOb = !...指向了自己定义的数组原型方法,这样当调用数组 api 时,就可以通知依赖更新。如果数组中包含着引用类型,会对数组中的引用类型再次进行观测。 这里用一张流程图来说明: ?...如果 userDef 是函数的话,就会定义 getter 为调用 createComputedGetter(key) 的返回值。...所以 defineComputed 函数的作用就是定义 getter 和 setter ,并且在最后调用 Object.defineProperty 给计算属性添加 getter/setter ,当我们访问计算属性时就会触发这个

    79521

    vue面试之Composition-API响应式包装对象原理

    函数入口会检查类型,首先调用isPlainObject检查是否是对象。如果不是对象,将会直接返回该参数,因为非对象类型并不可观察。...(target); // 遍历对象本身的可枚举属性,这里注意:通过def方法定义的Symbol标记并非可枚举属性 for (let i = 0; i length; i++) {...const keys = Object.keys(target);// 遍历对象本身的可枚举属性,这里注意:通过def方法定义的Symbol标记并非可枚举属性for (let i = 0; i length...= property.set; // arguments.length === 2表示没有传入val参数,并且不是readonly对象,这时该属性的值:响应式对象的属性可以直接取值拿到 /...getter || setter) /* not only have getter */ && arguments.length === 2) { val = target[key];

    44920
    领券