2010-04-16 44 views
7

Tôi là một người mới tương đối để lập trình hướng đối tượng trong JavaScript và tôi không chắc chắn cách "tốt nhất" để xác định và sử dụng các đối tượng trong JavaScript. Tôi đã nhìn thấy cách "kinh điển" để xác định các đối tượng và khởi tạo một cá thể mới, như được hiển thị bên dưới.Tạo đối tượng mới trong JavaScript

function myObjectType(property1, propterty2) { 
    this.property1 = property1, 
    this.property2 = property2 
} 
// now create a new instance 
var myNewvariable = new myObjectType('value for property1', 'value for property2'); 

Nhưng tôi đã nhìn thấy những cách khác để tạo ra các trường hợp mới của các đối tượng theo cách này:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
}); 

Tôi thích làm thế nào mà cách thứ hai xuất hiện - mã là tự chủ tài liệu. Nhưng câu hỏi của tôi là:

  1. Cách nào "tốt hơn"?

  2. Tôi có thể sử dụng cách thứ hai để nhanh chóng một biến của một đối tượng kiểu đó đã được xác định bằng cách sử dụng "cổ điển" cách xác định loại đối tượng với điều đó tiềm ẩn constructor?

  3. Nếu tôi muốn tạo một mảng các đối tượng này, có bất kỳ cân nhắc nào khác đối với không?

Xin cảm ơn trước.

+2

có một chuỗi tốt về điều này cách đây vài ngày. http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript – lincolnk

+0

Theo quy ước, bạn nên viết hoa chữ cái đầu tiên của các hàm "đối tượng". – Sydwell

Trả lời

7

Nó thực sự không phù hợp. Bằng cách này:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
}); 

... nói chung là tốt hơn nếu có nhiều hơn 2/3 lập luận, vì nó trợ khả năng đọc và làm cho nó dễ dàng hơn để tránh những vấn đề đối số tùy chọn (fn(null,null,null,123')).

Một xem xét khác là hiệu suất.Việc truyền các đối số theo cách thông thường sẽ nhanh hơn, nhưng tốc độ tăng tốc này chỉ trở nên quan trọng trong các tình huống rất nhạy cảm với hiệu năng.

Tôi có thể sử dụng cách thứ hai đó để khởi tạo biến của loại đối tượng đã được xác định bằng cách sử dụng kiểu "cổ điển" để xác định loại đối tượng với hàm tạo ngầm không?

Không dễ dàng. Nếu bạn muốn tạo một constructor bằng cách sử dụng một băm thay vì chỉ qua các đối số, và bạn không có quyền kiểm soát nguồn, sau đó bạn có thể "quấn" nó:

var _constructor = SomeConstructorFunction; 

SomeConstructorFunction = function(hash) { 
    return new _constructor(hash.property1, hash.property2); 
}; 

tôi sẽ không thực sự khuyên bạn rối tung với API của bên thứ ba chỉ vì lợi ích của phong cách.

Nếu tôi muốn tạo một mảng các đối tượng này, có bất kỳ cân nhắc nào khác không?

Mảng lớn bao nhiêu? Mảng chính xác là gì? Hiệu suất có thể có giá trị xem xét ...

1

Vâng, cách thứ hai có vẻ đẹp và hữu ích trong trường hợp "lớp" có nhiều tùy chọn thiết lập. Tuy nhiên, lưu ý rằng bạn đang thực sự xây dựng một đối tượng khác trong tiến trình.

Tôi khuyên bạn nên đọc một số mã từ một hoặc một khung Javascript khác và tìm một kiểu hấp dẫn bạn.

1

1) Tôi sẽ nói phương pháp # 2 được nhiều người ưa thích, dù sao đi nữa. Ví dụ với 2 thuộc tính không phải là khác nhau, nhưng những gì nếu bạn muốn làm điều này:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
    //Leaving several properties out, don't want them populated 
    property8: "This is the value for property 8" 
    property9: "This is the value for property 9" 

}); 

Hãy suy nghĩ về bao nhiêu sự kết hợp của quá tải (hoặc theo dõi các null s) bạn phải phải xử lý tài sản bạn có thể hoặc không muốn cung cấp cho đối tượng bằng phương pháp đầu tiên. Đây là nhiều hơn phương pháp tiếp cận linh hoạt và có thể mở rộng hơn.

2) Chỉ cần cho phép nó với một hàm tạo trống, điều này sẽ sạch hơn nhiều cho việc khởi tạo.

3) Độ dài/khả năng đọc, đặc biệt là với nhiều đối tượng. Nhìn vào JSON, nó khá sạch sẽ/dễ đọc, một lần nữa ít nhất là với tôi, nếu bạn thích kiểu đó, việc tạo các mảng đối tượng của bạn trông giống như rất tương tự trong phương pháp # 2.

3

Cách tốt nhất để tạo các đối tượng javascript là bỏ thuốc lá sử dụng mới (ít nhất là nếu bạn đăng ký trại Crockford)

myObjectType = function(props) { 
    // anything defined on props will be private due to the closure 

    props.privateVar = "private"; 

    // anything defined on obj will be public 
    obj = {}; 

    obj.testing = new function() { 
    alert(props.privateVar); 
    }; 

    return obj; 
}; 
instance = myObjectType({prop1: "prop"}); 

// if we want inheritance, it just means starting with the base type instead of 
// a new object 
subType = function(props) { 
    obj = myObjectType(props); 
    obj.subTypeProperty = "hello."; 

    return obj; 
}; 

Trang 52 của Javascript: The Good Parts, tôi khuyên bạn nên nó: -)

+0

Gah! 'hàm mới() {...}' là hoàn toàn sai! sử dụng các chức năng của nhà máy/xây dựng là tốt và tốt, nhưng 'chức năng mới ...' rất sai. –

+1

@SeanMcMillan nói rằng nó sai chỉ hữu ích khi bạn mang các đối số :) –

+2

@ GôTô: Công bằng. 'new function() {...}' sẽ tạo một đối tượng mới bắt nguồn từ nguyên mẫu của hàm ẩn danh và sử dụng hàm ẩn danh để khởi tạo nó. Bạn kết thúc việc khởi tạo một đối tượng mà bạn không cần. Điều này thực sự giống như một lỗi đánh máy với tôi. Dù bằng cách nào, 'obj.testing' sẽ là một đối tượng, không phải là một hàm, và cảnh báo sẽ chạy trên tạo, không phải là một phương thức. Việc khởi tạo một hàm ẩn danh 'mới' hoàn toàn dư thừa với việc chỉ định một đối tượng mới (' {} '). –

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