1

我有一个上传文件的小应用程序:

<html>
<script type="text/javascript">
 var upload = function(){
    alert(document.getElementById('up_file').files[length]);
 };
</script>   
<body>

<input type='file' id='up_file'   />
<input type='button' value='Submit' onclick="upload();" />
    <p id="p"></p>

</body></html> 

(很短)

请继续在您的代码编辑器中复制并粘贴它,然后在谷歌中打开。在你的谷歌浏览器中打开它之后,打开它的开发者工具并在它的控制台中写这个

document.getElementById('up_file').files

然后它返回

FileList{0:File, Length:1, item:function}(请展开此对象)

现在,当我们必须上传一个文件并想要获取该文件的名称时,我们必须编写代码,document.getElementById('up_file').files[0].name然后它返回文件名为flower.jpg

情况1

当您展开对象时,FileList您会注意到有一个属性名称length。现在,当您键入document.getElementById('up_file').files[length]then 它应该返回 1 因为当您扩展FileList对象时,您已经看到它们的属性length是 1 但是当我们编写document.getElementById('up_file').files[length]它时意外返回另一个对象然后 1 !该对象是:

File {webkitRelativePath: "", lastModifiedDate: Fri Aug 30 2013 13:42:08 GMT+0530 (India Standard Time), name: "Creek.jpg", type: "image/jpeg", size: 264409…}

如果我们写document.getElementById('up_file').files[length].name它,它会返回与document.getElementById('up_file').files[0].name该文件名相同的东西!

问题:

1)为什么javascript在我们写的时候会返回一个包含文件数长度的对象document.getElementById('up_file').files[length]

案例2

在该FileList对象中,在您展开它之前还有另一个属性名称,但是当item您展开对象时FileList,那里没有名称为是,我不确定,50%)。itemFileListitem

看,typeof __proto__是一个对象,然后可以使用点(。)国家访问项目,但它总是undefined在我写时返回__proto__.item。我不打算进一步解释,因为我的意思是……

问题:

1) 这个项目是什么?

2}如何获取__proto__对象的属性?


好吧,实际上我很困惑,当我在互联网上搜索时,我变得更加困惑!你可能不喜欢这个问题,因为它......你知道有点混乱


感谢您的所有回答。

4

2 回答 2

2

document.getElementById('up_file').files[length]

这个问题与访问文件的属性有关。

在 JS 中有两种访问对象属性的方法。

[]数组类型表示法 - 使用文字字符串或包含字符串的变量定义索引。

files['length']

或者

var lengthProp = 'length';
files[lengthProp]

.表示法 -
只需使用点访问属性
files.length

1)它返回对象的原因是因为files是一个数组。并且索引长度(javascript将其作为未定义的变量读取)实际上是未定义的。对于数组浏览器的未定义索引,返回数组中的第一项。这是第一个文件对象。

2)通过扩展我认为你的意思是在控制台中查看对象。__proto__属性实际上是对象原型的访问器。对于files对象,原型未定义。控制台显示为__proto__构造函数。在 JS 中它实际上是未定义的

于 2014-04-08T17:44:01.053 回答
0
document.getElementById('up_file').files[length]

// should be:
document.getElementById('up_file').files.length

2}如何获取__proto__对象的属性?

document.getElementById('up_file').files.item(0)
// return the first file

var files = document.getElementById('up_file').files;
console.log(files.__proto__ === Object.getPrototypeOf(files));
// -> true
于 2014-04-08T17:35:35.633 回答