2010-07-02 37 views
7

Tôi có một mảng đối tượng hiện có được xác định bằng JSON. Các đối tượng rõ ràng là loại đối tượng. Làm cách nào để liên kết chúng với một loại đối tượng tùy chỉnh để cung cấp cho họ chức năng cụ thể?Thay đổi Kiểu của đối tượng trong JavaScript

+0

nếu đối tượng có thuộc tính bổ sung/phương pháp, bạn cần gì hơn? bạn có thể cung cấp một số ví dụ? – mykhal

+0

.. ý tôi là, bạn có các loại đối tượng tùy chỉnh như vậy đã được xác định hay bạn muốn biết cách thực hiện? – mykhal

Trả lời

11

Cách mà tôi sẽ làm việc trong tất cả các trình duyệt là một trong hai làm tăng thêm mỗi mục trong mảng với các thuộc tính và phương pháp mà bạn muốn, hoặc vượt qua các đối tượng để một constructor và tạo ra một đối tượng mới dựa trên đối tượng già các thuộc tính và phương thức.

Hoặc nếu bạn không quan tâm đến IE:

var obj = { 
    name : "Jeremy" 
}; 

function CustomType() { 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
} 

CustomType.prototype.sayHi = function() { 
    alert(this.greeting + ", " + this.name); 
}; 

obj.__proto__ = CustomType.prototype; 
obj.constructor.call(obj); 

obj.sayHi(); 
+1

Tôi quan tâm đến IE, và tôi đã đi với đề xuất của bạn, tạo ra một phương thức sửa đổi đối tượng được truyền vào đối tượng và trả về nó cho người gọi. Tôi quá quen với việc sử dụng "phước lành" trong Perl và có thể sửa đổi đồ vật theo ý thích của tôi. – Ray

4

Tôi không tin rằng có bất kỳ cách nào để thay đổi loại đối tượng khi nó được tạo. May mắn thay, bạn có thể không thực sự cần phải thay đổi lớp, của các đối tượng của bạn - bạn có thể sẽ hài lòng với việc đưa ra các đối tượng một số phương thức mới và chức năng khác. (Sự khác biệt thực sự duy nhất là điều gì sẽ xảy ra nếu bạn THAY ĐỔI lớp học, và hầu hết mọi người không thay đổi lớp học trong khi mã đang chạy.)

Tôi sẽ làm ví dụ cho bạn. Trước tiên, tôi sẽ tạo ra một đối tượng đơn giản để đại diện cho các đối tượng JSON bạn có:

var myobj = new Object() 
myobj.name = "Fred" 

Sau đó, tôi sẽ tạo ra một số lớp học mà bạn muốn để có thể gán cho myobj:

function Speaker() { 
    this.speak = function() { 
     window.alert("Hello, " + this.name); 
    } 
} 

này lớp mới Speaker có một số chức năng hữu ích: nó có thể sử dụng phương pháp speak() thông tin hữu ích đầu ra:

var s = new Speaker() 
s.name = "Sally" 
s.speak() 

thi đã cho m e thông báo "Xin chào, Sally". Thật không may, bạn không muốn một đối tượng MỚI (như s) với chức năng này, bạn muốn đối tượng hiện có (myobj) để có nó. Đây là cách bạn làm điều đó:

myobj.speak = s.speak 

Bây giờ khi tôi thực hiện điều này:

myobj.speak() 

Tôi thấy thông báo "Xin chào, Fred".

Để tóm tắt: tạo đối tượng làm những gì bạn muốn. Sao chép tất cả các phương thức (và bất kỳ biến số trợ giúp nào) vào đối tượng mới của bạn. Ngoại trừ một số sử dụng bất thường của thừa kế, điều này sẽ làm cho đối tượng mới của bạn hoạt động như mong muốn.

2

Nếu bạn muốn sử dụng một phương pháp cụ thể trên chúng, bạn có thể sử dụng áp dụng/gọi.

Hoặc bạn có thể sao chép các phương thức cho đối tượng tùy chỉnh của mình.

function Object1() { 
    this.aValue = "10"; 
} 

function CustomObject() { 
    this.customValue = "6"; 
} 

function convertToCustom(obj) { 
    var custom = new CustomObject(); 
    for(var key in obj) { 
    custom[key] = obj[key]; 
    } 
    return custom; 
} 

var obj = new Object1(); 
var custom = convertToCustom(obj); 

console.log(custom.customValue); // <- 6 
console.log(custom.aValue);  // <- 10 
0

Là một bổ sung cho câu trả lời của Jeremy, bạn có thể sử dụng Object.create thay vì trực tiếp chơi với proto. Bạn cũng sẽ cần một hàm "mở rộng".

Vì vậy, được đưa ra ví dụ của Jeremy, bạn có thể có một cái gì đó như thế này:

var obj = { 
name : "Jeremy" 
}; 


function CustomType() { 
} 

CustomType.prototype.init = function(){ 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
    return this; //let's make it fluent 
} 

CustomType.prototype.sayHi = function() { 
    console.log(this.greeting + ", " + this.name); 
}; 

function extend(obj, props) { 
    for(prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      obj[prop] = props[prop]; 
     } 
    } 
    return obj; //let's make it fluent 
} 

obj = extend(Object.create(CustomType.prototype), obj).init(); 

obj.sayHi(); 
1

Nếu bạn không cần phải xây dựng, bạn có thể làm như sau:

Object.assign(new CustomType, {}); 
Các vấn đề liên quan