JS为一个深层对象添加属性并不生效(再次获取显示"undefined"), 是什么原因?

发布于 2022-09-12 02:07:01 字数 2047 浏览 17 评论 0

需求

想要向blob对象中添加一个name属性, 并返回这个blob对象

现在的对象结构:

re = {
    response(一个blob对象),
    其他属性...
}

尝试的方法

//不可行
re.response.name = 'helloworld';
return re.response;

//不可行
var blob = re.response;
blob.name = 'helloworld';
return re.response;

//可行
var blob = re.response;
blob.name = 'helloworld';
return blob;

主要是这里有疑惑, blobre.response难道不是指向的同一个对象吗? 为什么对他们两个进行赋值和获取, 还有区别

我又写了一个demo, 想要复现问题, 结果他又正常运行了

var blob = new Blob(['helloworld']);
var obj = {b:blob};
blob.name = 'filename';
console.log(obj.b.name); //filename
console.log(blob == obj.b); //true

问题代码及运行效果

/**
 * 返回blob
 * @param {string} url
 */
function GMFetch(url){
    return new Promise((resolve)=>{
        GM_xmlhttpRequest({
            url : url,
            responseType: 'blob',
            onload : function(re){
                console.log(re);
                var blob = re.response; //TODO 此处必须先获取到blob对象再赋值
                blob.name = getFileName(url);
                console.log(re);
                console.log(blob);
                console.log(re.constructor );
                console.log(re.response.constructor );
                console.log(blob.constructor );
                console.log(re.response == blob);
                console.log('获取到请求响应'+re.response.size);
                console.log('获取到请求响应'+re.response.name);
                resolve(re.response);
            },
            onerror:function(){
                console.log('请求失败:'+url);
            }
        });
    }).then((blob)=>{return blob});
}

控制台打印:
Snipaste_2020-04-09_10-16-13.png

原始代码是一个油猴脚本:
https://greasyfork.org/zh-CN/...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羁客 2022-09-19 02:07:01
re.ersponse == blob

这里好像有拼写错误。

我不知道你用了什么 ajax 库,但是这个 response 貌似不是 re 的属性。是不是 getter 啊?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文