2013-11-24 18 views
5

Vì vậy, JavaScript là một ngôn ngữ hàm, các lớp được định nghĩa từ các hàm và phạm vi hàm tương ứng với hàm tạo lớp. Tôi nhận được tất cả bây giờ, sau một thời gian khá dài nghiên cứu làm thế nào để OOP trong JavaScript.Trình tạo đối tượng tự đẩy

Điều tôi muốn làm là không nhất thiết có thể, vì vậy trước hết tôi muốn biết đây có phải là một ý hay hay không. Vì vậy, chúng ta hãy nói rằng tôi có một mảng và một lớp học như sau:

var Entry = function(name, numbers, address) { 
    this.name = name; 
    if(typeof numbers == "string") { 
    this.numbers = []; 
    this.numbers.push(numbers); 
    } 
    else this.numbers = numbers; 
    this.address = address; 
}; 

var AddressBook = []; 

Và tôi thêm địa chỉ liên lạc với các chức năng sau:

function addContact(name, numbers, address) { 
    AddressBook.push(new Entry(name, numbers, address)); 
} 

Tôi không thể làm cho nó để new Entry() sẽ đặt chính nó vào AddressBook? Nếu tôi không thể làm điều này khi tạo ra, nó sẽ là thú vị để làm điều đó với một phương pháp trong nguyên mẫu Entry là tốt. Tôi không thể tìm ra cách để làm bất cứ điều gì tương tự.

Trả lời

7

Bạn có thể thử đi qua các tài liệu tham khảo AddressBook mảng đến chức năng giống như ví dụ:

var Entry = function(name, numbers, address, addressBook) { 
    this.name = name; 
    if(!(numbers instanceof Array)) { 
    this.numbers = [numbers]; 
    } 
    else this.numbers = numbers; 
    this.address = address; 
    addressBook.push(this); 
}; 

var addressBook = []; 

function addContact(name, numbers, address) { 
    new Entry(name, numbers, address, addressBook) 
} 
+0

Giải pháp tuyệt vời; đang nêu rõ 'mục nhập mới' không có mã tiêu chuẩn biến được gán (nghĩa là nó hoạt động dưới chế độ nghiêm ngặt)? – gchiconi

+0

Simple pass-by-reference. Bạn có mảng 'AddressBook' đã được định nghĩa trong một phạm vi bên ngoài, chuyển nó tới Entry mới (tức là' ab' param), sau khi bạn hoàn thành công cụ trong "constructor", bạn thêm chính mình vào mảng được truyền vào (một lần nữa, nó được chuyển qua tham chiếu). – rdodev

+0

Nó sẽ là chế độ nghiêm ngặt tuân thủ nếu bạn đã làm điều này bên trong cơ thể của một hàm/lớp. Như bây giờ AddressBook là một toàn cầu, đó là một no-no. – rdodev

3

xét lại cách tiếp cận thiết kế. Vai trò chính của đối tượng "Entry" là Chủ thông tin. Bạn nên đóng gói chức năng AddToAddressBook trong một số loại bộ điều khiển hoặc eventHandler.

Chi tiết Bạn có nhiều hơn 1 trách nhiệm và thường không phải là một ý tưởng hay để liên kết chặt chẽ 2 mối quan tâm. (ví dụ: Nguyên tắc thiết kế liên quan đến Nguyên tắc Trách nhiệm Duy nhất và Tách các Mối quan tâm.)

Chủ thông tin - một đối tượng được thiết kế để biết một số thông tin nhất định và cung cấp thông tin đó cho các đối tượng khác.

Cấu trúc - một đối tượng duy trì mối quan hệ giữa các đối tượng và thông tin về các mối quan hệ đó.

Tôi khuyên bạn nên đọc các nguyên tắc SOLID và cố gắng giữ cho trách nhiệm của từng đối tượng tập trung hẹp. Mã của bạn sẽ ít phức tạp hơn và dễ bảo trì và mở rộng về sau.

Kiểm tra - http://aspiringcraftsman.com/series/solid-javascript/
Có ví dụ về sản phẩm và giỏ hàng gần với kịch bản của bạn ở trên.

+0

+1 cho hướng dẫn tuyệt vờ[email protected] đã trả lời câu hỏi của tôi và giải quyết được vấn đề của tôi, nhưng câu hỏi của bạn có lời khuyên tốt cho tôi và bất cứ ai chạy vào câu hỏi này trong tương lai – gchiconi

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