2009-07-17 28 views
8

Trong Javascript OO, khi nào tôi nên sử dụng từ khóa this?Khi nào sử dụng điều này trong javascript OO?

Ngoài ra, nếu tôi muốn gọi phương thức của một lớp từ một phương pháp khác của cùng một lớp, tôi có nên sử dụng this hoặc chỉ tên của hàm? Ví dụ: điều này có đúng không?

function Foo() 
{ 
    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    this.bar(); //should I use this.bar() or just bar()? 
    } 
} 
+1

Bạn không thể sử dụng chỉ 'bar() 'vì' this' không bao giờ là tiềm ẩn trong JavaScript (vì nó không thực sự là một ngôn ngữ hướng đối tượng thích hợp.)' Bar() 'sẽ lần đầu tiên nhìn đối với một biến được định nghĩa là 'bar' trong hàm' this.baz', thì nó sẽ tìm một biến được định nghĩa là 'bar' trong hàm' Foo' và cuối cùng nó sẽ tìm trong phạm vi toàn cục, và thất bại là nó sẽ ném một lỗi. – Blixt

+1

Điều quan trọng là phải tìm hiểu hệ thống nguyên mẫu JavaScript, vì vậy đây là một câu hỏi hay. Nhưng nếu tôi định làm một chương trình OO lớn trong JavaScript, tôi sẽ sử dụng Joose.js hoặc Js.Class. – Nosredna

+0

Tại sao điều này lại được bình chọn? –

Trả lời

6

Khi nói đến JavaScript "hướng đối tượng", đây là hướng dẫn tuyệt vời Mark Dickinson ở đây trên SO liên kết với: Private Members in JavaScript. Nó đi vào chi tiết về một số thứ khác bạn không thực sự cần bây giờ, nhưng một khi bạn hiểu JavaScript hoạt động như thế nào, bạn sẽ thấy nó khá khác với ngôn ngữ hướng đối tượng thông thường của bạn khi nói đến những thứ như những gì this thực sự có nghĩa là .

Tôi muốn nói rằng trong trường hợp của bạn, bạn chắc chắn nên sử dụng this, nhưng có lẽ chức năng của bạn phải ở trong prototype một phần của "lớp" của bạn (điều này tránh được xác định lại chức năng mỗi khi một trường hợp mới được tạo ra.)

+0

Tôi đã tạo một mẫu đơn giản cho các lớp có vẻ rất giống với những gì Douglas Crawford có trong bài viết của anh ấy (mà tôi đã liên kết.) Nếu nhìn vào mã giúp bạn luôn có thể xem: http://blixt.org/js /classes.js (tệp thô) http://blixt.org/js#project/js-classes (với cú pháp nổi bật) – Blixt

+1

ý của bạn là gì bởi phần 'nguyên mẫu của lớp'? –

+1

Các hàm có thuộc tính 'prototype' được sử dụng làm nguyên mẫu cho các đối tượng được tạo khi gọi hàm bằng từ khóa' new'. Nếu bạn đặt 'Foo.prototype.bar = function() {...};', thì tất cả các đối tượng được tạo bằng 'new Foo()' sẽ có thuộc tính 'bar' tham chiếu đến hàm' Foo.prototype.bar' . – Blixt

0

Trong trường hợp cụ thể này, tốt nhất nên sử dụng biến tự tham chiếu ở vị trí this để tránh nhầm lẫn và đau đầu bên trong các chức năng.

function Foo() 
{ 
    var self = this; 

    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    self.bar(); 
    } 
} 

Lý do đó là vì kể từ khi tất cả mọi thứ trong javascript là một đối tượng, từ khóa this bên trong một hàm đề cập đến chức năng cha mẹ. Bằng cách xác định một biến ở một phạm vi nhất định, biến bảo đảm của bạn sẽ duy trì phạm vi của nó.

+0

lý do là gì? –

+0

Bạn làm điều đó để phạm vi hiển nhiên. Rất nhiều người sử dụng "đó" thay vì "tự". – Nosredna

+0

Hoặc bạn có thể làm $ điều này. –

0

Chỉ cần nhấn mạnh và thấu hiểu câu trả lời trước đó của @ tj111 Tôi đề nghị bạn đọc this. Để hiểu rõ hơn về chức năng phạm vi.

0

Phiên bản chính xác là phiên bản không đưa ra lỗi khi bạn cố gắng gọi hàm. Nếu bạn bỏ qua this, bạn sẽ nhận được một ngoại lệ ReferenceError.

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