2011-11-04 46 views
5

Tôi muốn để có thể làm điều này:Javascript: thiết lập các thuộc đối tượng

var user1 = { 
    name: 'John', 
    gender: 'male' 
} 


var user2 = { 
    name: 'James', 
    gender: 'male', 
    email: '[email protected]' 
} 

user1.someSetMethod({email: '[email protected]'}); 
user2.someSetMethod({name: 'Jenny', gender: 'female'}); 

Kết quả mong muốn:

var user1 = { 
    name: 'John', 
    gender: 'male', 
    email: '[email protected]' 
} 


var user2 = { 
    name: 'Jenny', 
    gender: 'female', 
    email: '[email protected]' 
} 

Tôi muốn có một phương pháp mà sẽ đặt thuộc tính theo những gì là được chuyển vào hàm. Là thuộc tính không tồn tại tôi muốn nó được tạo ra, nếu có, tôi muốn nó được ghi đè.

Phương pháp này có tồn tại trong Javascript không?

+0

jQuery có một rất đẹp mở rộng phương pháp: http://api.jquery.com/jQuery.extend/ –

Trả lời

6

Đây là bình thường được gọi là mở rộng đối tượng của bạn. Hầu như mọi thư viện JavaScript đều có phương pháp riêng để thực hiện điều này. Hoặc bạn có thể viết của riêng bạn trong một vài dòng mã.

Sử dụng phương pháp của jQuery, bạn muốn làm điều đó như vậy:

var user1 = { 
    name: 'John', 
    gender: 'male' 
}; 

$.extend(user1, { 
    email: '[email protected]' 
}); 

user1.email === '[email protected]'; //true 
+4

Hoặc trong JS đơn giản: ' var user1 = {name: 'John', gender: 'male'}; user1 ["email"] = "[email protected]"; ' – mcmlxxxvi

3

Không, bạn không muốn thực hiện việc này.

Cách duy nhất để thêm phương thức cho tất cả các đối tượng là gia hạn Object.prototype.

Làm như vậy (trong các trình duyệt ES3 như IE8) có hệ quả là thêm thuộc tính vào danh sách liệt kê.

Ví dụ:

Object.prototype.extend = function (o) { 
    // clone properties of o into this 
}; 

var someObj = {}; 
for (var key in someObj) { 
    console.log(key); // "extend" 
} 

Điều tốt nhất bạn có thể làm là sử dụng Object.extend

Object.extend(user2, { 
    name: "Jenny", 
    gender: "female" 
}); 

pd có một thực hiện extend hoặc bạn có thể sử dụng:

Object.extend = function (target, source) { 
    for (var key in source) { 
    target[key] = source[key]; 
    } 
}; 
+0

@pagewil: \ Tôi đang nói với bạn những gì bạn muốn không thể được thực hiện hợp lý, nhưng bạn có thể sử dụng một thay thế. – Raynos

+0

Cảm ơn điều này là chi tiết hơn :) – wilsonpage

+0

Tôi thực sự yêu cầu nó trong một bối cảnh NodeJS, nên đã đề cập trước đó thực sự. – wilsonpage

2

Nếu bạn sẵn sàng sử dụng jquery, bạn có thể sử dụng phương pháp mở rộng của nó, cùng với một số giá trị mặc định sẽ đảm bảo tất cả các thuộc tính bạn muốn được đặt chính xác.

Something như thế này:

function whatever(obj1) { 
    var defaults = { 
     name: 'Foo Bar', 
     email: '[email protected]', 
     gender: 'male' 
    }; 

    return $.extend(defaults, obj1); 
} 
Các vấn đề liên quan