2008-10-09 5 views
12

Tôi biết cách sử dụng JSON để tạo các đối tượng, nhưng dường như không có cách nào để sử dụng JSON để tạo một đối tượng thuộc loại đối tượng cụ thể.Làm cách nào để sử dụng JSON để tạo đối tượng Thừa kế từ Loại đối tượng?

Dưới đây là một ví dụ về một đối tượng và tạo ra một thể hiện của nó:

Person = function() { }; 
Person.prototype = { 
    FirstName: null, 
    GetFirstName: function() { 
     return this.FirstName; 
    } 
}; 

//Create an instance of the Person Object 
var me = new Person(); 
me.FirstName = "Chris"; 
alert(me.GetFirstName()); //alert the FirstName property 

Bây giờ, tôi muốn sử dụng JSON để tạo một đối tượng Person mới để các chức năng GetFirstName hoạt động trên nó.

Dưới đây là một cái gì đó giống như là tôi đang tìm cách để làm (nhưng mã này không hoạt động):

var you = new Person() { FirstName: "Mike" }; 
// OR 
var you = new Person{ FirstName: "Mike" }; 

Liệu có cách nào để sử dụng JSON để tạo một đối tượng mà là của một loại cụ thể?

CẬP NHẬT: Mẫu của tôi với đối tượng Person chỉ nhằm đơn giản hóa câu hỏi. Trong thực tế, tôi không thể sửa đổi các hàm tạo của các đối tượng thực tế mà tôi cần để tạo ra các cá thể. Các đối tượng là một phần của thư viện của bên thứ ba.

CẬP NHẬT: Sử dụng một số gợi ý bên dưới, tôi đã có thể tìm ra cách tạo đối tượng kế thừa từ bản gốc và chấp nhận JSON trong hàm tạo của nó. Đây là gọn gàng!

personWrapper = function(obj){ 
    for(var o in obj){ 
     this[o] = obj[o]; 
    } 
}; 
personWrapper.prototype = new Person(); 

var you = new personWrapper({FirstName: "Chris"}); 
alert(you.GetFirstName()); 
alert(you instanceof Person); // returns True - we are successfully inheriting from Person! 

Trả lời

13

Tôi không tưởng tượng như vậy. Tôi muốn tạo một hàm trên lớp Person để khởi tạo từ một đối tượng JSON nếu tôi là bạn.

function Person() { 
    this.loadFromJSON = function(json) { 
     this.FirstName = json.FirstName; 
    }; 
} 

Nếu bạn không biết lớp nào đối tượng JSON đã đại diện trước, có thể thêm một biến phụ vào JSON của bạn.

{ _className : "Person", FirstName : "Mike" } 

Và sau đó có chức năng 'người xây dựng' để diễn giải nó.

function buildFromJSON(json) { 
    var myObj = new json["_className"](); 
    myObj.loadFromJSON(json); 
    return myObj; 
} 

Cập nhật: kể từ khi bạn nói lớp là một phần của một thư viện của bên thứ ba mà bạn không thể thay đổi, bạn có thể hoặc là mở rộng các lớp với mẫu, hoặc viết một chức năng mà chỉ populates lớp bên ngoài.

ví dụ:

Person.prototype.loadFromJSON = function(json) { 
    // as above... 
}; 

hoặc

function populateObject(obj, json) { 
    for (var i in json) { 
     // you might want to put in a check here to test 
     // that obj actually has an attribute named i 
     obj[i] = json[i]; 
    } 
} 
+2

này là khá nhiều chính xác cách thức Microsoft Ajax hoạt động. Bạn định nghĩa một phương thức trả về một kiểu cụ thể. Lớp ajax truy vấn loại và tạo proxy đối tượng js. Sau đó, tất cả các cuộc gọi json trả về một tham số '__type' cho thư viện biết proxy nào sẽ sử dụng để khởi tạo đối tượng. – Travis

4

Bạn có thể cho phép người mới() để chấp nhận một đối tượng để cư thuộc tính với như một tham số.

var you = new Person({ firstName: 'Mike' }); 
+0

Trong thực tế, đây là cách một số khung công tác JS xuất hiện trong một đối tượng "tùy chọn" để ghi đè lên các thuộc tính mặc định của một đối tượng tại thời điểm xây dựng. –

2

Bạn có thể lấy được đối tượng từ chúng. constructor của bạn có thể chấp nhận các đối tượng mà bạn muốn, nhưng gọi constructor của họ trong một thời trang không bị ảnh hưởng:

function yourWrapper(obj) { 
    theirObject.call(this); 
    for (var s in obj) { 
     this[s] = obj[s]; 
    } 
} 
yourWrapper.prototype = new theirObject(); 

Hoặc một cái gì đó như thế :)