vue3 proxy [[target]]怎么取值
```js// ==UserScript==
// @name vue3 proxy []怎么取值
// @namespace http://tampermonkey.net/
// @version 0.1
// @descriptiontry to take over the world!
// @author You
// @match https://pan.baidu.com/pfile/video*
// @icon https://www.google.com/s2/favicons?sz=64&domain=baidu.com
// @grant none
// ==/UserScript==
(function() {
'use strict';
const proxy = window.Proxy;
window.Proxy = function () {
let app = arguments._
if (app?.uid === 30) {
console.log("app.attrs", app.attrs);
let videoinfo = app.attrs.videoinfo;
console.log("videoinfo", videoinfo);
console.log("videoinfo", JSON.parse(JSON.stringify(videoinfo)));
}
return new proxy(...arguments);
};
// Your code here...
})();
```
```js
const originObjects=[]; //建一个数组储存原始对象
const proxy = window.Proxy;
window.Proxy = function () {
let app = arguments._
if (app?.uid === 30) {
originObjects.push(arguments) //暴露Proxy的原始对象
console.log("target",originObjects)
console.log("app.attrs", app.attrs);
let videoinfo = app.attrs.videoinfo;
console.log("videoinfo", videoinfo);
console.log("videoinfo", JSON.parse(JSON.stringify(videoinfo)));
}
return new proxy(...arguments);
};
```
建议阅读一下MDN文档
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
```
语法
const p = new Proxy(target, handler)
参数
target
要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
handler
一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。
```
Proxy劫持里,`arguments`实际上就是原始对象,原始对象只能在劫持过程中暴露出来,劫持完成后是获取不到的
随便加一行把`arguments`暴露出来就行 比如`originObjects.push(arguments)` 可以给个地址看看么?
哥哥是参考的这个库?
Hook Vue3 app v1.0.3
https://bbs.tampermonkey.net.cn/thread-2886-1-1.html
(出处: 油猴中文网)
这个videoinfo也是个Proxy,[]是原对象,你既然劫持了Proxy,取原对象不是很简单的嘛,加个判断就好了:
if ('videotag' in arguments) {} 本帖最后由 脚本体验师001 于 2023-4-4 08:34 编辑
王一之 发表于 2023-4-3 22:45
可以给个地址看看么?
哥哥是参考的这个库?
嗯是的有参考 @steven026 大佬的这个库,但是取到的值是proxy类型,拿不出来呀
上面代码可以直接运行看到结果,在 百*盘 里主页打开个视频。哥哥有空的时候帮忙看看
本帖最后由 脚本体验师001 于 2023-4-4 08:24 编辑
cxxjackie 发表于 2023-4-3 22:50
这个videoinfo也是个Proxy,[]是原对象,你既然劫持了Proxy,取原对象不是很简单的嘛,加个判断就 ...
就是[]对象里的值拿不出来呀,老师教教我怎么操作取值,直接打印是 '' 值 steven026 发表于 2023-4-4 09:08
```js
const originObjects=[]; //建一个数组储存原始对象
我还是不明白,这个videoinfo是个Proxy对象,是不能够直接读取的。如何转为普通object类型? steven026 发表于 2023-4-4 09:08
```js
const originObjects=[]; //建一个数组储存原始对象
原来还得延迟一秒才能拿到值,这emmm的,不好玩
``` const originObjects=[]; //建一个数组储存原始对象
const proxy = window.Proxy;
window.Proxy = function () {
let app = arguments._
if (app?.uid === 30) {
originObjects.push(arguments) //暴露Proxy的原始对象
console.log("target",originObjects);
setTimeout(() => {
Object.keys(originObjects._.attrs.videoinfo).forEach(function (value, index) {
console.log("videokeys", value, index);
});
}, 1000);
}
return new proxy(...arguments);
}; 脚本体验师001 发表于 2023-4-4 10:32
我还是不明白,这个videoinfo是个Proxy对象,是不能够直接读取的。如何转为普通object类型? ...
我没视频测试去测试,
如果是Proxy套Proxy,而你只要获取内层的Proxy,你可以忽略外层Proxy,直接去劫持内层Proxy,
如果内层Proxy不是Vue的app,可以不判断app.uid,通过其他方式判断去劫持
我以前写的Hook Vue3 app只是劫持了整个页面所有Proxy的其中一部分即app,因为我的目的是劫持Vue,所以非app的Proxy我并不需要,就没有去劫持了。 本帖最后由 脚本体验师001 于 2023-4-4 14:40 编辑
steven026 发表于 2023-4-4 13:53
我没视频测试去测试,
如果是Proxy套Proxy,而你只要获取内层的Proxy,你可以忽略外层Proxy,直接去劫持 ...
老师你的库没有问题,通过doc(...).__vue__也能直接读取
关键已经半路截杀了,不用再操作el属性了。就在这时问题出现了,™videoinfo怎么还是个空值
灵犀所致延迟了一秒才发现有值。那么vue3真的太牛逼了,发现数据传递并不能实时性,发现真是海量的数据传递呀,啧啧啧,不懂
页:
[1]
2