Hóa ra nó thực sự có thể. Khi hàm được tạo, bằng cách sử dụng cú pháp function
hoặc hàm tạo Function
, hàm này sẽ nhận được thuộc tính nội bộ [[Call]]
. Nó không phải là một đặc tính của hàm, mà là thuộc tính mà bất kỳ hàm nào được nhận khi được xây dựng.
Trong khi đó chỉ có nghĩa là bất cứ điều gì với [[Call]]
có thể là chỉ Function
khi nó được xây dựng (tốt, có một ngoại lệ – Function.prototype
bản thân mà không kế thừa từ Function
), điều đó không có nghĩa là nó không thể trở thành một cái gì đó khác sau này, trong khi bảo quản tài sản [[Call]]
. Vâng, miễn là trình duyệt của bạn không phải là IE < 11.
Điều cho phép thay đổi phép thuật sẽ là __proto__
từ ES6, đã được triển khai trong nhiều trình duyệt. __proto__
là một tài sản huyền diệu có chứa nguyên mẫu hiện tại. Bằng cách thay đổi nó, tôi có thể tạo ra hàm kế thừa từ một thứ không phải là Function
.
function CallablePoint(x, y) {
function point() {
// Complex calculations at this point
return point
}
point.__proto__ = CallablePoint.prototype
point.x = x
point.y = y
return point
}
// CallablePoint should inherit from Function, just so you could use
// various function methods. This is not a requirement, but it's
// useful.
CallablePoint.prototype = Object.create(Function.prototype)
Thứ nhất, các nhà xây dựng cho CallablePoint
làm cho một Function
(chỉ Function
s được phép bắt đầu với [[Call]]
tài sản. Tiếp theo, tôi thay đổi nguyên mẫu của nó, vì vậy nó sẽ kế thừa CallablePoint
. Tại thời điểm này, tôi có một hàm điều đó không 't kế thừa từ Function
(loại khó hiểu).
Sau khi tôi định nghĩa constructor cho CallablePoint
s, tôi đặt nguyên mẫu của CallablePoint
để Function
, vì vậy tôi có CallablePoint
được thừa kế từ Function
.
01.
Bằng cách này, các trường hợp CallablePoint
có chuỗi mẫu: CallablePoint -> Function -> Object
, trong khi vẫn được gọi. Ngoài ra, vì đối tượng có thể gọi được, nó có theo đặc điểm kỹ thuật, typeof
bằng 'function'
.
Bạn biết rằng 'điểm chức năng() {return point}' sẽ chỉ trả lại chính hàm đó? Bạn định làm gì với điều này? Nó sẽ cho phép bạn làm 'p()()()()()()()()()' nhưng điểm là gì? (không có ý định chơi chữ). –
@FelixKling dễ hiểu tôi đã phải tự mình sử dụng lại để trả lời câu hỏi này – Pointy
Vì mục đích hoàn chỉnh, ES6 có giải pháp tốt hơn cho vấn đề này, hãy xem: http://stackoverflow.com/questions/36871299/how-to-extend-function-with -es6-class – 0xc0de