Proxy和Reflect的使用

在ES6中新增了Proxy这个类及Reflect这个对象

Proxy用来代理对象监视对象的作用

Reflect上有操作对象的一些方法 这些方法对应了Proxy上捕获器的方法

Proxy: 监视代理对象

const obj = {
    name: '小明',
    age: 18
}

在js中如果要监听一个对象的一些响应式就可以用到Proxy Vue3响应式原理就是使用的Proxy

Proxy 是一个类 创建时需要传入俩个参数 :
1为需要监听的对象 2为捕获器方法对象 有13个捕获器方法 在此列举四个捕获器方法,其他捕获器方法关于原型的,感兴趣的可以查下其他资料 常用的就为下面四个

// 创建一个对象
const obj = {
    name: '小明',
    age: 18
};
// new一个Proxy 用来监视obj对象
const proxy = new Proxy(obj, {
    // 这些捕获器方法会在对所监视的对象进行相对操作时 被回调

    // 一:获取对象属性时的捕获器方法:
    // 参数说明:1为所监视的对象,2为操作时对象的key,3为new出的代理对象
    get(e,k,r) {
        console.log(e,`对象被获取了${k}的值为:${e[k]}`);
        // return e[k];
        // 利用Reflect
        Reflect.get(e,k,r); 
    },

    // 二:设置或修改对象属性时的捕获器方法:
    // 参数说明:1为所监视的对象,2为操作时对象的key,3为设置或修改时的值,4为new出的代理对象
    set(e,k,n,r) {
        console.log(e,`对象被设置了${k}的值为:${n}`);
        // e[k] = n;
        // 利用Reflect
        Reflect.set(e,k,n,r); 
    },

    // 三:查询对象属性时的捕获器方法
    // 参数说明:1为所监视的对象,2为操作时对象的key
    has(e,k) {
        console.log(e,`对象被查看是否当前有${k}这个属性`);
        // 返回布尔类型 true/false
    },

    // 四:删除对象属性时的捕获器方法
    // 参数说明:1为所监视的对象,2为操作时对象的key
    deleteProperty(e,k) {
        console.log(e,`对象被删除了${k}这个属性`);
        // delete e[k];
        // 利用Reflect
        Reflect.deleteProperty(e,k);
    },
});

// 操作:

console.log(proxy.name);   // 此时会回调触发proxy里get捕获器方法
proxy.age = 22;            // 此时会回调触发proxy里set捕获器方法
console.log('girlFriend' in proxy); // 返回布尔类型 true/false 可做条件编译来使用 
if('girlFriend' in proxy); // 此时会回调触发proxy里has捕获器方法
delete proxy.age;          // 此时会回调触发proxy里delterProperty捕获器方法 

对于捕获器get和set方法最后一个参数:new出来的代理对象的解释:

Reflect有一个construct方法,当使用构造函数时 new出来的对象类型想要指向另一个构造函数时就可以用到construct这个方法

function Man(name,age) {
    this.name = name;
    this.age = age;
}

function Woman() {
    
}

const c = new Man('c',30)
console.log(c)
// 此时c的类型为Man 想要指向Woman 就可以用到Reflect上的construct方法

// construct方法会返回一个新的对象 
// 参数说明:1参为new时的构造函数名,2参为new时需要传入的属性值,3为需要类型指向的构造函数名
const ck = Reflect.construct(Man,['c',30],Woman)

console.log(ck) 
// 此时ck的类型就为Woman类型 
console.log(ck.__proto__ === Woman.prototype) 
// 验证下: 此时ck的隐式原型和Woman的原型属性是绝等的 也就是说隐式原型指向的是Woman的原型属性

在ES6类中 ES6类的代码转ES5构造函数的源码 实现继承时就使用了Reflect上的construct方法来实现

<think>嗯,用户遇到了Android Studio没有代码提示的问题,我需要帮他们解决。首先,得考虑可能的原因,然后一步步排查。 首先想到的是检查IDE设置。用户可能不小心关闭了代码补全功能。Power Save Mode是个常见问题,开启后会禁用很多功能,包括代码提示。应该让他们检查状态栏有没有这个提示,然后关闭。 然后,检查Code Completion的设置是否正确。确保自动弹出的设置是启用的,快捷键可能被修改过,需要确认是不是默认的Ctrl+Space或者其它。另外,有时候排除的文件类型可能被错误添加,导致某些文件没有提示。 接下来是缓存问题。Invalidate Caches / Restart是解决很多奇怪问题的通用方法,尤其是缓存损坏的情况。建议用户执行这个操作,然后重启。 第三方插件冲突也可能导致问题。需要让用户进入安全模式,或者禁用最近安装的插件,看看是否恢复正常。如果有问题的插件,卸载后重启。 项目配置错误也是一个可能因素。比如SDK没有正确配置,或者Gradle同步失败,导致代码提示失效。用户应该检查SDK路径,确保Gradle同步成功,必要时手动触发同步。 文件类型关联错误的话,可能导致AS不识别代码类型。检查文件是否被错误关联到普通文本,改回Java或Kotlin。 如果以上步骤都没解决,可能需要检查项目结构是否损坏,比如.iml文件或.idea目录有问题。删除这些文件并重新导入项目或许有效。 最后,确保Android Studio所有插件都是最新版本,有时候旧版本的bug会导致功能异常。 还要考虑用户是否在特定情况下遇到问题,比如只有某个项目出问题,还是所有项目。如果是单个项目,可能项目配置有问题;如果是全局,可能是IDE设置或插件问题。需要用户提供更多细节,但通过上述步骤应该能覆盖大部分情况。</think>Android Studio代码提示失效的常见解决方法可按照以下步骤排查: 一、检查IDE基础设置 1. 关闭省电模式 $$文件 \rightarrow 电源节省模式$$ ▶️ 状态栏若显示"Power Save Mode",点击即可关闭 2. 开启自动补全功能 $$设置 \rightarrow Editor \rightarrow General \rightarrow Code Completion$$ ✅ 勾选"Show suggestions as you type" ⚙️ 调节匹配度阈值建议保持默认(0.7) 二、重建索引(高频解决方案) 1. 删除缓存索引 $$文件 \rightarrow Invalidate Caches / Restart \rightarrow Invalidate and Restart$$ ▶️ 等待索引重建完成(观察右下角进度条) 2. 手动删除索引文件 ```shell rm -rf ~/Library/Caches/Google/AndroidStudio*/file-system/* ``` 三、检查插件冲突 1. 进入安全模式 $$Help \rightarrow Edit Custom Properties$$ ```properties idea.suppress.diagnostic.toolwindow=true ``` ▶️ 重启后观察是否恢复 2. 禁用第三方插件 $$设置 \rightarrow Plugins$$ 🚫 暂时禁用最近安装的插件(如Lombok、Alibaba等) 四、SDK与Gradle配置验证 1. 检查JDK配置 $$设置 \rightarrow Build \rightarrow Build Tools \rightarrow Gradle$$ ✅ 确认使用正确的JDK版本(推荐JDK11+) 2. 强制Gradle同步 ```groovy // build.gradle添加测试语句 println("Gradle version: ${gradle.gradleVersion}") ``` ▶️ 点击大象图标执行同步 五、特殊场景处理 - 针对Kotlin代码提示失效: $$Tools \rightarrow Kotlin \rightarrow Configure Kotlin Plugin Updates$$ ▶️ 更新到最新稳定版 - XML布局文件无提示: ```xml 检查xmlns声明是否完整 xmlns:app="http://schemas.android.com/apk/res-auto" ``` 六、终极解决方案 1. 备份配置文件 ```shell cp -r ~/Library/Preferences/AndroidStudio* ~/Desktop/AS_Backup ``` 2. 全新安装 - 卸载时保留SDK - 重新安装最新稳定版 建议优先尝试步骤二的重建索引(解决率约60%),如仍未恢复,可依次进行后续排查。若问题仅出现在特定项目,请检查项目根目录的`.idea`文件夹配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值