2010-08-22 72 views
17

Tôi đang cố gắng gọi hàm MyMethod từ bên trong một đối tượng nhưng không cú pháp nào dưới đây hoạt động. Phải có một lỗi thực sự rõ ràng dưới đây nhưng tôi không thể nhìn thấy nó.Javascript - Làm thế nào để bạn gọi một hàm bên trong một lớp từ bên trong lớp đó?

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 

    <script type="text/jscript"> 

    function MyObject() { 

     //how do I get one of these to work?? 
     this.MyMethod; //does not work 
     this.MyMethod(); //does not work either 
     MyMethod(); //does not work either 

     this.MyMethod = function() { 
     alert('It works'); 
     } 
    } 

    var test = new MyObject(); 

    </script> 

</head> 
<body> 

</body> 
</html> 
+1

Bạn có thể di chuyển một phần của mã của bạn "this.MyMethod = function() { alert ('Nó hoạt động');" trên các cuộc gọi phương pháp thế nào để MyMethod? và xem điều đó có tạo nên sự khác biệt không? – InSane

Trả lời

21

Có hai vấn đề chính

  1. Loại MIME là text/javascript, không text/jscript
  2. Bạn đang xác định phương pháp sau bạn cố gắng gọi nó

Vì vậy:

function MyObject() { 
    this.MyMethod = function() { 
     alert('It works'); 
    } 
    this.MyMethod(); //should now work 
    } 

    var test = new MyObject(); 
+0

http://ejohn.org/apps/learn/#6 – sova

2

bạn đã đặt cuộc gọi đến phương thức riêng tư bên trong hàm tạo của lớp javascript. ở thời điểm đó các chức năng chưa được khởi tạo

nhưng nếu bạn khởi tạo các đối tượng như sau:

var test = new MyObject(); 

và sau đó làm điều này:

test.myMethod(); 

nó sẽ làm việc.

-2

Tôi khá chắc chắn rằng bạn có thể xác định các phương thức ở bất kỳ đâu trong tệp, ngay cả sau khi bạn gọi cho chúng, nhưng cách chúng bạn định nghĩa phương thức là lỗ hổng.

http://ejohn.org/apps/learn/#5

Chú ý rằng nếu bạn định nghĩa một biến với một chức năng ẩn danh như giá trị của nó thì bạn không thể gọi hàm theo tên (vì nó không có một). Thay vào đó bạn nên đặt tên nó theo quy ước

function nameOfTheFunction(arguments) { 
... 
} 

tôi thấy đường dẫn sau sẽ là rất hữu ích:

http://www.dustindiaz.com/javascript-function-declaration-ambiguity/

+1

Lỗ hổng không phải là cách mà phương thức được xác định, lỗ hổng là khi phương pháp được xác định. –

0
var MyObject = function MyObject() { 
     this.MyMethod = function() { 
     alert('It works'); 
     } } 

var test = new MyObject(); test.MyMethod(); 

trên sẽ làm. Hoặc bạn chỉ có thể tạo một hàm tạo và gọi phương thức này bên trong đó. Vì vậy, tại thời điểm tạo ra đối tượng mà nó sẽ gọi this.MyMethod()

1

2 cách để định nghĩa một hàm cung cấp Accessibility khác nhau

Thứ nhất, thiết lập nó một tính chất của hàm phụ huynh, như được thực hiện trong " "Phiên bản tập lệnh của bạn bên dưới. Nếu bạn làm điều này, chức năng chỉ sử dụng được sau bạn đưa ra định nghĩa.

Thứ hai, xác định hàm bằng cách tiếp cận cổ điển của "function functionName() {...}". Định nghĩa này trải qua "cẩu", có nghĩa là hàm trở nên có sẵn trong toàn bộ đối tượng cha, tức là ngay cả trên vị trí được xác định. Bạn có thể thấy điều này trong phiên bản "B" trong mẫu bên dưới, dựa trên mã của người đăng ban đầu.Cũng trong ngày https://jsfiddle.net/dnL4j30u/

<script> 
    function MyObject() { 

    MyMethod(); 

    this.MyMethod = function() { 
     console.log('It works A'); 
    } 

    this.MyMethod(); 

    MyMethod(); 

    function MyMethod() { 
     console.log('It works B'); 
    } 

    } 
    var test = new MyObject(); 
</script> 

Đầu ra là

It works B  (this works because the second definition gets hoisted) 
It works A 
It works B 
Các vấn đề liên quan