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

红茶不能洒
  • 9

需求

想要向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/...

回复
阅读 1.7k
1 个回答
✓ 已被采纳
re.ersponse == blob

这里好像有拼写错误。

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

你知道吗?

宣传栏