2012-11-12 37 views
14

Trong cuốn sách của Douglas Crockford "Javascript: The Good Parts", ông đề cập đến Object Specifiers trong việc truyền các giá trị cho một đối tượng mới. Về cơ bản, thay vì đi qua các tham số để một hàm theo một trật tự nhất định, ông đề nghị đi qua một đối tượng với các thông số chứa bên trong, như vậy:Object Specifiers trong Javascript

var myObject = someFunction({a: 1, b: 2, c: 3}); 

gì không được giải thích, tuy nhiên, là làm thế nào để xử lý những thông số sau chúng đã được thông qua. Thay vì làm như sau để thiết lập các giá trị mặc định:

function someFunction(params){ 
    this.a = params.a || 0; 
    this.b = params.b || 0; 
    ... 
} 

Một cách khác để xử lý một lượng lớn thông số mà không bị tiết lộ là gì?


EDIT: Nhìn vào các câu trả lời dưới đây, việc sử dụng các phi trong vòng lặp là một lựa chọn tuyệt vời. Một cách khác để thực hiện điều đó trong khi đặt các giá trị mặc định khác nhau cho mỗi thuộc tính là gì? Có cách nào để tạo một đối tượng với các giá trị mặc định khác nhau và so sánh với giá trị đó không?

+0

Bạn có thể có một tiêu chuẩn "-object mà bạn so sánh đầu vào trong một số loại vòng lặp. Cách jQuery-plugin thường xử lý việc này (điều này đang sử dụng jQuery) cũng có thể thú vị: http://docs.jquery.com/Plugins/Authoring#Defaults_and_Options – m90

+0

Lưu ý rằng việc thực hiện từng tham số cho phép bạn chỉ định các giá trị mặc định riêng lẻ (đối tượng mặc định mà m90 đề xuất cũng cho phép điều này), hoặc nếu không có hành động đặc biệt nếu các tham số nhất định không được cung cấp. – nnnnnn

+0

m90 & nnnnnn: Tôi đã cập nhật câu hỏi của mình để tính các giá trị mặc định khác nhau nếu bạn quan tâm để minh họa câu trả lời. – opes

Trả lời

8

Thông thường nó được thực hiện bằng cách sử dụng đối tượng defaults, từ đó bạn sao chép thuộc tính nếu họ không hiện có trong params. Đối tượng đó có thể là riêng tư hoặc có sẵn cho công chúng để cấu hình.

var defaults = { a:null, b:1, ...}; 
function someFunction(params) { 
    for (var prop in defaults) 
     if (prop in params) 
      this[prop] = params[prop]; 
     else 
      this[prop] = defaults[prop]; 
} 

hoặc

function someFunction(custom) { 
    var params = { a:null, b:1, ...}; 
    for (var prop in custom) 
     params[prop] = custom[prop]; 
    // now use params 
} 

Đôi khi cũng là custom/params đối tượng được truyền vào hàm được mở rộng chính nó, nhưng sau đó trong tài liệu nó nên được đề cập một cách rõ ràng rằng đối tượng có thể được chỉnh sửa:

var defaults = { a:null, b:1, ...}; 
function someFunction(params) { 
    // modifies params object! 
    for (var prop in defaults) 
     if (! (prop in params)) 
      params[prop] = defaults[prop]; 
    // now use params 
} 

Nếu bạn đang sử dụng thư viện có chức năng extend, bạn thường có thể rút ngắn lần khởi tạo này thành

var params = $.extend({}, defaults, custom); 
    // create an empty object, copy the defaults, and overwrite with custom properties 
+0

Điều này chắc chắn có vẻ như giải pháp sạch nhất cho câu hỏi của tôi. Điều này thật đúng với gì mà tôi đã tìm kiếm. – opes

1

Lặp qua các trường trong đối tượng được truyền làm tham số, tạo mỗi trường dưới dạng trường trên đối tượng này.

function someFunction(params){ 
    for(x in params){ 
    this[x] = params[x]; 
    } 
} 

làm việc Ví dụ: http://jsfiddle.net/59kzD/

4

Làm thế nào về việc sử dụng một cho-in loop

function someFunction(params){ 

    for(var key in params){ 
     if(params.hasOwnProperty(key){ 
      var def = null; 
      if(key == 'a' || key == 'b'){ 
       def = 10; 
      } 
      if(key == 'c' || key == 'd'){ 
       def = undefined; 
      } 
      this[key] = params[key] || def ; 
     } 
    } 
} 
+0

Chú ý;) Một điểm mặc dù, tôi nghĩ rằng nó thích hợp để chỉ ra rằng điều này sẽ làm cho một bản sao nông chỉ. Nhưng điều đó thực sự có thể được mong muốn. – Yoshi

+0

Đây là câu trả lời tuyệt vời cho câu hỏi ban đầu của tôi. Nếu bạn quan tâm để chỉnh sửa nó vào tài khoản cho các giá trị mặc định khác nhau, tôi sẽ đánh giá cao nó. – opes

+0

@sprawl .. Ý của bạn là gì theo các giá trị mặc định khác nhau ?? –

0

Mở rộng câu trả lời bằng Bergi: var params = $.extend({}, defaults, custom);

Bây giờ chúng ta có thể sử dụng Object.assign({}, defaults, custom) trong ES6 mà không cần bất kỳ thư viện.

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