如何判断一个Javascript对象是否为文件?

7

我有一个函数,它操作一个包含"upload"成员的对象,该成员的类型为File。我想检测这个事实,以便我可以忽略它并跳过所有这种类型的对象。

我在控制台中尝试了很多方法,但似乎没有返回"true"。以下是我在控制台断点内的一些徒劳无功的尝试记录:

> values.avatar
{upload: File}
> values.avatar.upload
File {name: "29_Drawing Hands by Escher.jpg", lastModified: 1446580115000, lastModifiedDate: Tue Nov 03 2015 14:48:35 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 1314300, …}
> values.avatar.upload.isPrototypeOf(File)
false
> File
ƒ File() { [native code] }
> File.prototype
File {constructor: ƒ, …}
values.avatar.upload.isPrototypeOf(File.prototype)
false
> values.avatar.upload.prototype 
undefined
> File.isPrototypeOf
ƒ isPrototypeOf() { [native code] }
> File
ƒ File() { [native code] }
> values.avatar
{upload: File}
> File
ƒ File() { [native code] }
> File.__proto__
ƒ Blob() { [native code] }
> values.avatar.upload.__proto__
File {constructor: ƒ, …}
values.avatar.upload.isPrototypeOf(File.__proto__)
false
> values.avatar.upload.isPrototypeOf(Blob.__proto__)
false

显然我缺乏对JavaScript中原生类型和原型工作方式的基本理解。


5
尝试使用values.avatar.upload instanceof File - pushkin
3个回答

10
你可以使用 instanceof 关键字进行检查。
if (values.avatar.upload instanceof File)
  // yes, it's a File type.
else
  // no, it's not.

4

检查

values.avatar.upload instanceof File 

-1

你也可以通过它的原型进行测试:

if(values.avatar.upload.prototype === File.prototype) {
  // true
} else {
 // false
}

例如,您可以使用以下代码:
File.prototype.isPrototypeOf(values.avatar.upload)

例如,以下代码将返回 true:

var file = new File([""], 'text.txt');
console.log(File.prototype.isPrototypeOf(file));


实例没有prototype属性。这完全是错误的。 - Patrick Roberts
我看不到 OP 是否有实例。 - Bhojendra Rauniyar
“...但更加规范的答案是” - 我已经尽力坚持使用 OP。 - Bhojendra Rauniyar
让我尽可能清楚地解释给你听。File.prototype.isPrototypeOf(values.avatar.upload)是正确的。它等同于values.avatar.upload instanceof File,后者更容易理解。values.avatar.upload.prototype === File.prototype是错误的。甚至留在你的答案中也没有意义。 - Patrick Roberts
抱歉,我不太明白你的说法。两者都在我的答案中用于不同的用例。第一个是用于简单对象,另一个是用于实例。 - Bhojendra Rauniyar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接