2012-06-15 24 views
5

Tôi viết lại một trong những phương pháp cốt lõi javascript của:Javascript Lập trình meta: có được tên của chức năng hiện đang thực hiện được động viết lại

Element.prototype._removeChild = Element.prototype.removeChild; 
Element.prototype.removeChild = function(){ 
    callback(); 
    this._removeChild.apply(this,arguments); 
} 

tôi muốn tự động lấy tên của phương pháp này (trong trường hợp này "removeChild") từ bên trong của hàm đang được viết lại động. Tôi sử dụng arguments.callee.name nhưng dường như không trả lại gì, nghĩ rằng đó chỉ là một chức năng ẩn danh. Làm cách nào để nhận được tên của hàm mà hàm ẩn danh đang được gán cho?

+4

Javascript không có phương pháp. Chỉ các hàm được gán cho các thuộc tính. Trong trường hợp này, 'Element.prototype.removeChild' là một thuộc tính mà nó được gán, nó cũng có thể được gán cho một nơi khác cùng một lúc. Nó không phải là tên của hàm, nó không có tên. Hàm này không biết có bao nhiêu thuộc tính được gán hoặc thuộc tính nào được gán cho nó. – Esailija

Trả lời

5

một chức năng ẩn danh. Bạn chỉ đang gán hàm ẩn danh này cho thuộc tính Element.prototype.removeChild, nhưng điều đó không làm cho thuộc tính đó trở thành tên cho hàm. Bạn có thể gán cùng một chức năng cho nhiều biến và thuộc tính, và không có cách nào để biết tên mà nó đã được gọi.

Bạn tuy nhiên có thể cung cấp cho các chức năng một tên riêng mà bạn có thể truy cập như arguments.callee.name:

Element.prototype.removeChild = function removeChild() { 
    .... 
} 
+0

ahhhh có ý nghĩa 100%. cảm ơn! – user730569

+1

+1 Điều này là hoàn hảo bởi vì sau đó hàm có thể tự tham chiếu bằng 'removeChild', nhưng' removeChild' vẫn chưa được xác định bên ngoài hàm. Ngoại trừ trong IE 8 và dưới đây mà không thực sự thực hiện Javascript một cách chính xác. Trong IE 8 và dưới 'removeChild' được tiếp xúc với phạm vi bên ngoài (có thể toàn cục) trừ khi bạn quấn một bao quanh xung quanh toàn bộ điều:' (function() {Element.prototype.removeChild = function removeChild() {...})(); ' – Paulpro

+0

Vì bạn đã đặt tên cho hàm, bạn có thể sử dụng tên thay vì không dùng' arguments.callee'. Nhưng sau đó một lần nữa, 'removeChild.name' ...: P – Esailija

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