Javascript将图像存储在数组中的对象中,在console.log()中,但在记录对象时
Javascript storing image in an object in an array, is there in console.log(), but when logging the object?
我有一个问题,我不能理解。
我有一个对象数组,数组中每个对象的属性是id、source和cache。id为标识符,source为文件源,cache为实际文件。
当我控制台记录整个数组时,我得到以下输出:
console.log(array);
[Object]
0: Object
cache: img
id: "strawberry"
source: "http://127.0.0.1/images/strawberry.png"
它清楚地表明数组有一个索引0,它是一个对象。对象有一个缓存属性,它是一个图像对象,id是strawberry, source是图像的来源。
我的问题是试图检索缓存图像对象。经过测试,我发现如果我控制台记录0的实际索引,而不是整个数组,我得到;
console.log(array[0]);
Object {id: "strawberry", source: "http://127.0.0.1/images/strawberry.png"}
可以看到缓存已经消失了吗?我不明白这个吗?
如果重要的话,我使用strict.
谁能解释一下为什么会这样?设置缓存
var Assets = function (assets) {
this.assets = assets;
};
Assets.prototype.load = function () {
// For each asset
this.assets.forEach(function (asset, index) {
// Create new image object
var img = new Image();
// Image load handler
img.addEventListener("load", function () {
// Add image to assets
this.assets[index].cache = img;
}.bind(this), false);
// Set the image source
img.src = this.assets[index].source;
}, this);
};
var assets = new Assets([{id: "strawberry", source: "http://127.0.0.1/images/strawberry.png"}]);
assets.load();
console.log(assets.assets); // shows cache image obj
console.log(assets.assets[0]); // show no cache
嗯…因为它还没有?
如果你这样做:
setTimeout(function() {
console.log(assets.assets[0]); // show cache
}, 1000); // adjust accordingly
则会看到cache
。;)
this.assets[index].cache = img;
在加载图像之前不会执行,由于JavaScript的异步特性,console.log
可能会更早执行,给你未定义的结果。
我很确定你得到了:
[Object]
0: Object
cache: img
id: "strawberry"
source: "http://127.0.0.1/images/strawberry.png"
在单击控制台中某个展开按钮(>)之后。就在执行此操作之前,图像实际上已经完成加载,因此可以看到cache
.
但是,对于assets.assets[0]
,整个Object {id: "strawberry", source: "http://127.0.0.1/images/strawberry.png"}
在加载映像之前被记录,因此您没有看到cache
。
所以我相信实际情况是:
-
console.log(assets.assets)
打印出> [Object]
,cache
实际上还没有出现,但你没有注意到这一点,因为它被隐藏/崩溃了。 -
console.log(assets.assets[0])
打印出Object {id: "strawberry", source: "http://127.0.0.1/images/strawberry.png"}
,cache
也不存在。 - 图片已加载并附加到
cache
. 你点击">",展开
console.log(assets.assets)
打印出来的[Object]
,看到cache
在那里,因为它现在已经在那里了。相关文章:
- 如何在javascript中记录对象时强制使用toString
- 循环浏览JavaScript对象并记录其属性
- 在对象数组中添加具有相同名称的产品记录的价格
- 如何使用Immutable.js从javascript原始对象创建记录映射
- 什么是声明性环境记录,它与激活对象有何不同
- 错误:'历史记录.适配器'为null或不是对象
- 日志记录功能/对象名称's在函数堆栈内的javascript中
- 如何读取mysql表记录并存储在javascript对象中
- 使用单引号(撇号)转义将活动记录对象解析为 json
- JSDoc:如何记录父“类”的“选项”对象文字
- 如何从 javascript 对象中删除记录
- 在新的 Array Javascript 中对对象中的部分重复对象进行计数和记录
- Docusign / Salesforce:从 Salesforce 自定义对象发送信封会给出错误消息“记录中没有联系人
- 无法从 javascript 中的对象获取属性,但在记录其父级时可以将其打印到控制台
- 类型错误:“replaceState”调用了未实现接口历史记录的对象
- 将对象数组记录为 JSDoc 中回调函数的参数
- 使用单个查询将多个记录插入到 webSQL 表中,来自对象数组的数据
- 如何记录JavaScript对象(从UML的角度来看)
- 当Mocha Test失败时,它将一个对象记录到控制台
- 从对象记录特定的属性值