2012-03-28 41 views
5

Tôi đang đánh giá selfish và tôi tự hỏi làm thế nào tôi có thể khai báo các phương thức/trường riêng tư?Phương thức và trường riêng tư

+0

Nhìn vào các ví dụ tôi muốn nói đó là một câu hỏi khá hay :)) – mihai

+0

Tôi nghĩ ra cách giải quyết này liên quan đến các biến riêng tư + đóng cửa, bạn nghĩ sao? http://marcelorjava.wordpress.com/2014/06/07/object-oriented-programming-with-java-and-javascript/ – theMarceloR

Trả lời

4

Cách thông thường để thực hiện các chức năng riêng tư là sử dụng chức năng mà "các phương pháp" khác nhau của bạn đóng, ví dụ: nhặt Dog tấm gương của họ, thay đổi này:

// The basic Dog example 
var Dog = Base.extend({ 
    bark: function() { 
    return 'Ruff! Ruff!' 
    } 
}); 

Để

// Adding a private function 
var Dog = Base.extend((function(){ 
    function trulyPrivate() { 
    console.log(this.bark()); 
    } 

    return { 
    bark: function() { 
     return 'Ruff! Ruff!' 
    }, 
    logBark: function() { 
     trulyPrivate.call(this); 
    } 
    }; 
})()); 

Cách sử dụng:

new Dog().logBark(); // logs "Ruff! Ruff!" using the truly private function behind the scenes 

Re tin lĩnh vực, theo cách thông thường là để xây dựng bất cứ điều gì mà cần thực sự tin các trường từ bên trong hàm xây dựng của bạn để chúng đóng các biến (riêng tư) trong cuộc gọi đến hàm tạo, a'la Crockford's pattern:

function Foo(arg) { 
    var trulyPrivateData = arg; 

    this.logIt = function() { 
     console.log(trulyPrivateData); 
    }; 
} 

Cách sử dụng:

var f = new Foo(42); 
f.logIt(); // logs 42 even though there's no way, externally, to get that value from `f` 

... ích kỷ không đi với hàm xây dựng thực tế, nhưng initialize chức năng sẽ phục vụ cùng một mục đích:

var Dog = Base.extend({ 
    initialize: function(arg) { 
    var woof = arg || 'Ruff! Ruff!'; 
    this.bark = function() { 
     return woof; 
    }; 
    } 
}); 

Bây giờ, bạn không thể đặt woof (ngoại trừ thời gian xây dựng, bởi vì chúng tôi đã cố tình làm điều đó), bạn chỉ có thể truy xuất nó từ bark. Ví dụ: nó thực sự riêng tư (khác với chúng tôi đã cho phép rõ ràng bark để trả lại).

Nếu bạn nhận được vào các chi tiết kỹ thuật này, các bài viết từ blog của tôi có thể (hoặc không thể) có ích, kể từ khi bạn nhận được vào các chức năng riêng và như vậy, bạn thường phải bắt đầu quản lý this:

Và nếu bạn muốn một thứ khác để đánh giá, có Lineage project của tôi, tương tự như thuần chủng nguyên mẫu, nhưng dễ dàng truy cập vào các thuộc tính đối tượng cha mẹ, các hàm, vv và cú pháp tích cực khuyến khích phạm vi riêng cho loại điều này.

+0

Điều đó cung cấp cho bạn các thuộc tính riêng ở cấp lớp; Tôi không chắc rằng bạn có thể có các thuộc tính riêng cho từng cá thể mà không có một số sửa đổi đối với khung công tác đó. Tuy nhiên tôi chưa có nhiều cà phê sáng nay. – Pointy

+1

@Pointy: Không có sự khác biệt giữa phương pháp "cấp" và "lớp" cấp "trong JavaScript ngoại trừ cách bạn gọi chúng. Cách tôi gọi là 'truePrivate', nó là một ví dụ cụ thể. Nếu tôi gọi nó mà không có '.call' và vừa mới chuyển sang ví dụ' Dog' như một đối số, nó sẽ là "lớp" đặc biệt. Bạn không thể thực hiện các hàm riêng tư thực sự mà bạn gọi thông qua ký hiệu 'this.xyz()' trực tiếp trong JavaScript (bất kể khung công tác), bởi vì tất cả các thuộc tính trên cá thể là công khai.Thêm (khá ngày): http://blog.niftysnippets.org/2009/09/private-methods-in-javascript.html –

+0

Đúng bên phải; Tôi đã không thấy rằng có một "khởi tạo" cũng không thực sự tìm hiểu nhiều về khuôn khổ đó trong 15 giây tôi đã dành trên github "readme" :-) Nó chỉ làm cho các đối tượng, do đó, thêm một tài sản từ một đóng cửa không phải là bất kỳ khác với khuôn khổ hơn là không có nó. – Pointy

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