ES6 (lấy cảm hứng từ câu trả lời của sendy halim bên dưới):
myFunction.name
Giải thích về MDN . Kể từ năm 2015 hoạt động trong nodejs và tất cả các trình duyệt chính trừ IE.
Lưu ý: Trên các hàm bị ràng buộc, điều này sẽ cho " bound <originalName>
". Bạn sẽ phải loại bỏ "ràng buộc" nếu bạn muốn có được tên gốc.
ES5 (lấy cảm hứng từ câu trả lời của Vlad):
Nếu bạn có một tham chiếu đến hàm, bạn có thể làm:
function functionName( func )
{
// Match:
// - ^ the beginning of the string
// - function the word 'function'
// - \s+ at least some white space
// - ([\w\$]+) capture one or more valid JavaScript identifier characters
// - \s* optionally followed by white space (in theory there won't be any here,
// so if performance is an issue this can be omitted[1]
// - \( followed by an opening brace
//
var result = /^function\s+([\w\$]+)\s*\(/.exec( func.toString() )
return result ? result[ 1 ] : '' // for an anonymous function there won't be a match
}
- Tôi đã không chạy thử nghiệm đơn vị về điều này, hoặc xác minh sự khác biệt thực hiện, nhưng về nguyên tắc nó sẽ hoạt động, nếu không để lại nhận xét.
- Lưu ý: sẽ không hoạt động trên các chức năng bị ràng buộc
- Lưu ý: điều đó
caller
và callee
được coi là không dùng nữa.
[1] Tôi bao gồm nó ở đây vì nó hợp pháp và thường là đủ các công cụ tô sáng cú pháp không tính đến khoảng trắng giữa tên hàm và dấu ngoặc đơn. Mặt khác, tôi không biết về bất kỳ triển khai nào .toString () sẽ bao gồm khoảng trắng ở đây, vì vậy đó là lý do tại sao bạn có thể bỏ qua nó.
Để trả lời cho câu hỏi ban đầu, tôi sẽ bỏ thừa kế ký sinh và đi tìm một số mẫu thiết kế OOP truyền thống hơn. Tôi đã viết một TidBits.OoJs để thoải mái viết mã OOP bằng JavaScript với một bộ tính năng bắt chước C ++ (chưa hoàn thành, nhưng chủ yếu).
Tôi thấy từ các ý kiến mà bạn muốn tránh truyền parent
nhu cầu thông tin cho nhà xây dựng của nó. Tôi phải thừa nhận rằng các mẫu thiết kế truyền thống sẽ không cứu bạn khỏi đó, vì nó thường được coi là một điều tốt để làm cho sự phụ thuộc của bạn trở nên rõ ràng và được thi hành.
Tôi cũng sẽ đề nghị để tránh xa các chức năng ẩn danh. Họ chỉ thực hiện gỡ lỗi và định hình Pita vì mọi thứ chỉ hiển thị là "chức năng ẩn danh" và không có lợi ích gì cho họ mà tôi biết.