2011-07-07 50 views
7

Tôi đã sử dụng từ khóa new trong JavaScript cho đến thời điểm này. Tôi đã đọc về Object.create và tôi tự hỏi nếu tôi nên sử dụng nó thay thế. Những gì tôi không hoàn toàn nhận được là tôi thường cần phải chạy mã xây dựng, vì vậy tôi không thấy làm thế nào Object.create sẽ làm việc ở tất cả vì nó không kích hoạt bất kỳ chức năng để chạy.Có lý do nào để sử dụng Object.create() hoặc mới trong JavaScript không?

Bất cứ ai có thể cho tôi biết, Trong trường hợp nào tôi nên sử dụng Object.create thay vì new?

+0

Xem câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/4166616/understanding-the-difference-between- object-create-and-new-somefunction-in-ja –

+0

Xem điều này cũng như với tất cả các câu trả lời mới, http://stackoverflow.com/questions/387707/whats-the-best-way-to-define-a-class -in-javascript –

Trả lời

11

Cho đến nay, nếu bạn muốn tạo một đối tượng, bạn có thể chỉ sử dụng các chữ:

var obj = {}; 

hoặc Object constructor.

var obj = Object(); 

Nhưng không ai trong số những phương pháp này cho phép bạn xác định nguyên mẫu của đối tượng được tạo ra.

Đây là những gì bạn có thể làm với Object.create ngay bây giờ. Nó cho phép bạn tạo một đối tượng mới và đặt đối số đầu tiên làm nguyên mẫu của đối tượng mới. Ngoài ra, nó cho phép bạn thiết lập các thuộc tính của đối tượng mới được cung cấp làm đối số thứ hai.

Nó tương tự như làm một cái gì đó như thế này (không có đối số thứ hai):

function create(proto) { 
    var Constr = function(){}; 
    Constr.prototype = proto; 
    return new Constr(); 
} 

Vì vậy, nếu bạn đang sử dụng một cấu trúc tương tự như sau, khi này bạn muốn sử dụng Object.create.

Nó không thay thế cho new. Nó là một bổ sung để làm cho việc tạo ra các đối tượng duy nhất mà nên kế thừa từ một đối tượng đơn giản hơn.

Ví dụ:

tôi có một đối tượng a:

var a = { 
    someFunction: function() {} 
}; 

và tôi muốn b để mở rộng đối tượng này. Sau đó, bạn có thể sử dụng Object.create:

b = Object.create(a); 
b.someOtherFunction = function(){}; 

Bất cứ khi nào bạn có một hàm constructor, nhưng bạn chỉ nhanh chóng một đối tượng từ nó, bạn có thể có thể thay thế này với Object.create.

Có quy tắc chung áp dụng. Nó phụ thuộc rất nhiều vào chức năng của hàm tạo và cách bạn kế thừa từ các đối tượng khác, v.v.

+0

Có lẽ tôi dày đặc, nhưng tôi vẫn không hiểu khi nào bạn dùng Object.create vs new? Bạn có thể đưa ra một ví dụ mã về việc sử dụng Object.create và giải thích lý do tại sao mới sẽ không hoạt động? – jfriend00

+6

@ jfriend00: Bạn sẽ sử dụng 'Object.create' nếu mục đích duy nhất của hàm dựng là tạo một đối tượng trống thừa kế từ một đối tượng khác. –

+0

Điều đó giúp, cảm ơn. Có vẻ như tôi là phiên bản YUI mở rộng hỗ trợ ngôn ngữ được sử dụng để tạo đối tượng mới kế thừa nguyên mẫu của một đối tượng khác. Có đúng không? – jfriend00

3

Như đã đề cập, Object.create() thường được sử dụng khi bạn muốn một cách dễ dàng để thiết lập nguyên mẫu của đối tượng mới. Những câu trả lời khác không đề cập đến mặc dù, là hàm xây dựng (mà yêu cầu mới) không phải là tất cả những gì khác với bất kỳ chức năng khác. Trong thực tế, bất kỳ chức năng nào cũng có thể trả về một đối tượng và JavaScript thường thấy chức năng của nhà máy (như nhà thầu, nhưng không yêu cầu new hoặc sử dụng this để tham chiếu đối tượng mới). Các chức năng của nhà máy thường sử dụng Object.create() để đặt nguyên mẫu của đối tượng mới.

var barPrototype = { 
    open: function open() { /* ... */ }, 
    close: function close() { /* ... */ }, 
}; 
function createBar() { 
    return Object.create(barPrototype); 
} 

var bar = createBar(); 
2

Siêu muộn để chủ đề này .. nhưng tôi nghĩ rằng một sự khác biệt quan trọng mà cần phải được thực hiện là trong khi nhà xây dựng chỉ là chức năng, các nhà điều hành mới gọi hàm và nắm bắt được đối tượng kết quả mà có thể hữu ích khi trong một môi trường năng động. Nó cho phép tham chiếu đến các thuộc tính và phương thức trong quá trình thực hiện của hàm tạo cũng như có thể hoặc không hữu ích tùy thuộc vào tình huống. Nếu bạn quan tâm nhiều hơn đến việc có một nguyên mẫu đã đặt nhưng đối tượng chính nó là tĩnh hơn không, Object.create sẽ là một lựa chọn tốt hơn vì nó sạch hơn và không gây rối với chuỗi proto theo những cách bất ngờ như toán tử mới .

một số ví dụ đơn giản ..

var Foo = function(element) { 
    this.elem = element; 
    $(this.elem).css('color', 'blue'); 
    // using the new operator here gives access to this.elem 
    // immediately after that declaration is made, thus providing 
    // a comfortable dynamic system to work with 
} 

var bar = new Foo(someElem); 

đối lập với sự ..

var foo = { 
    elem : element,    // assume elem exists 
    $(this.elem).css('color', 'blue')// in the lexical scope 
} 

var bar = Object.create(foo); 
// This.elem does not exist until the object is returned now 
// and the .css method call will not execute 

Nó nên hơi rõ ràng lý do tại sao bạn sẽ muốn sử dụng một trong khác, như là một sự cố đơn giản ..

Sử dụng Mới khi bạn quan tâm đến việc có đối tượng động và ít hơn về chuỗi nguyên mẫu

Sử dụng Object.create khi bạn quan tâm ít hơn về năng động và nhiều hơn nữa về việc có một chuỗi nguyên mẫu rõ ràng. Tôi cũng sẽ lưu ý rằng các đối tượng được tạo với Object.create cũng có thể được tạo động bằng cách sử dụng một phương thức có tên là init mà bạn có thể xây dựng để gán các thuộc tính dựa trên nhu cầu của bạn và chỉ cần gọi nó trên đối tượng mới được trả về của bạn.

Mỗi phương pháp đều có những thăng trầm, tuy nhiên, các trường hợp sử dụng của chúng khá khác biệt theo ý kiến ​​của tôi. Tuy nhiên, rất có thể bạn sẽ thấy mình đang sử dụng Object.create vì hầu hết các tình huống sẽ kêu gọi một tình huống ít năng động hơn và cần nhiều hơn cho sự kế thừa.

0

Mã nguồn chính xác cho các Object.create() chức năng là:

function Object.Create(proto, propertiesObject) 
{ 
    var obj = {}; 

    Object.setPrototypeOf(obj, proto); 

    if(propertiesObject) 
    { 
     Object.defineProperties(obj, propertiesObject); 
    } 

    return obj; 
} 
Các vấn đề liên quan