一、背景 

用uniapp开发微信小程序时候发现报这个错误,记录下我是如何解决的!

二、报错信息

uniapp [Vue warn]: Error in onLoad hook: "TypeError: Attempting to change the setter of an unconfigurable property."

三、错误原因

由于在Object.defineproperty方法中,控制属性不可以被删除,unconfigurable 状态。

四、错误分析

我们来看下Object.defineproperty方法的具体使用:

Object.defineproperty 的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性

Object.defineproperty 参数

        Object.defineproperty方法需要传递3个参数

        Object.defineproperty(obj, prop, desc  )   

        参数1:obj     需要定义属性的当前对象

        参数2:prop    当前需要定义的属性名

        参数3:desc    描述符 一般是一个对象

        一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性。

Object.defineProperty(obj, variate, {
                enumerable:true, //控制属性是否可以枚举,默认值是false
                //writable:true, //控制属性是否可以被修改,默认值是false
                configurable:true, //控制属性是否可以被删除,默认值是false
                set: function (value) {
                    console.log('global set value!');
                    val = value; // 重新赋值
                    const data = {};
                    data[variate] = value;
                    console.log('page set value!');
                    page.setData(data);
                },
                get: function () {
                    console.log('global get value!');
                    // 在其他界面调用getApp().globalData.variate的时候,这里就会执行。
                    return val; // 返回当前值
                }
            });

最后还有最重要的两个属性 setget(即存取器描述:定义属性如何被存取),这两个属性是做什么用的呢?

注意:当使用了getter或setter方法,不允许使用writable和value这两个属性(如果使用,会直接报错滴)

五、解决办法

本次的错误,是 configurable 的值被设置成 FALSE 导致的,所以改成 TRUE 即可!注意看控制台的错误提示,也许你的是其他情况报错!

Logo

前往低代码交流专区

更多推荐