2012-12-27 71 views
6

Thuộc tính tĩnh dài của hàm dựng, hàm và đối tượng là gì?Thuộc tính độ dài của các hàm tạo hàm, mảng và đối tượng là gì?

Phương pháp tĩnh có ý nghĩa nhưng về độ dài của thuộc tính tĩnh thì sao?

Object.getOwnPropertyNames(Array) 
["length", "name", "arguments", "caller", "prototype", "isArray"] 

Object.getOwnPropertyNames(Function) 
["length", "name", "arguments", "caller", "prototype"] 

Lưu ý: Tôi nhận được câu trả lời về thuộc tính độ dài của Function.prototype không được hỏi tại đây.

Object.getOwnPropertyNames(Function.prototype) 
["length", "name", "arguments", "caller", "constructor", "bind", "toString", "call", "apply"] 

Object.getOwnPropertyNames(Object) 
["length", "name", "arguments", "caller", "prototype", "keys", "create", "defineProperty", "defineProperties", "freeze", "getPrototypeOf", "getOwnPropertyDescriptor", "getOwnPropertyNames", "is", "isExtensible", "isFrozen", "isSealed", "preventExtensions", "seal"] 
+2

ECMA-262 3rd edition, phần * 15.2.3 *, * 15.3.3 * và * 15.4.3 * xác định rằng tất cả các nhà xây dựng có một 'tài sản length', có giá trị là 1. – DCoder

+0

Cám ơn làm rõ :) nhưng tại sao 1 lý do cụ thể? –

Trả lời

6

Array, Function, và Object đều constructors, vì vậy họ đang tất cả các chức năng. Thuộc tính length của một hàm xác định số đối số (được đặt tên) mà hàm đó lấy. Từ ECMA-262 3rd edition, phần 15:

Mỗi built-in đối tượng Chức năng mô tả trong phần-cho dù là một nhà xây dựng, một chức năng bình thường , hoặc cả hai-có một thuộc tính length có giá trị là một số nguyên. Trừ khi được chỉ định khác, giá trị này bằng với số lượng đối số được đặt tên lớn nhất được hiển thị trong các tiêu đề phần cho mô tả hàm, bao gồm các tham số tùy chọn.

Và như DCoder chỉ ra:

ECMA-262 3rd edition, phần 15.2.3, 15.3.3 và 15.4.3 xác định rằng tất cả các nhà xây dựng có một tài sản dài, có giá trị là 1 .

Để điểm của bạn về trường tĩnh: Không có trường như vậy trong JavaScript, vì không có lớp nào trong JavaScript. Chỉ có các giá trị nguyên thủy, các đối tượng và các hàm. Đối tượng và chức năng (hoạt động như đối tượng) có thuộc tính.

Một điều có thể gây nhầm lẫn là Function thực ra là một chức năng. Một thực tế ít được biết đến là bạn có thể tạo các hàm bằng cách sử dụng hàm tạo này. Ví dụ:

var identity = new Function("a", "b", "return a") 
console.log(identity(42)) 

Ở trên sẽ in 42. Bây giờ nhận thấy hai điều: Function thực sự có đối số và làm điều gì đó với chúng; và tôi đã vượt qua nhiều đối số cho hàm tạo Function, mặc dù Function.length bằng 1. Kết quả, identity, cũng là một hàm, có thuộc tính length được đặt thành giá trị 2, vì đó là hàm có hai đối số.

+0

Tôi quan tâm đến độ dài tĩnh của lớp Hàm không phải là thuộc tính độ dài của các cá thể hoặc đối tượng hàm. Bạn đang nói về Function.prototype không phải chức năng. Object.getOwnPropertyNames (Hàm.nguyên mẫu) cũng trả về thuộc tính chiều dài khác nhau. –

+2

Tôi đảm bảo với bạn, chúng tôi đang nói về cùng một điều. 'Hàm.length' bằng với' 1' vì 'Hàm' là một hàm (đó là phần khó hiểu) có một đối số được đặt tên duy nhất. Lưu ý rằng 'Hàm' nhận ra nhiều hơn một đối số, nhưng chỉ có một đối số xảy ra được đặt tên trong triển khai nội bộ. – seliopou

+0

Bất kỳ thuộc tính nào trên hàm tạo được chia sẻ bởi tất cả các đối tượng hàm. Liệu tôi có sai? –

0

Tất cả các đề cập ở trên là các hàm có độ dài thuộc tính, cho biết số lượng đối số mà hàm nhận được. Đó là lý do tại sao chúng có độ dài như biến tĩnh ở đây.

fun = function(a) { alert(a); } 
//fun.length = 1 
+0

thuộc tính độ dài này được kế thừa bởi Function.prototype chứ không phải Function. –

Các vấn đề liên quan