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
Trả lời
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();
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
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.
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
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();
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, {});
- 1. javascript - thay đổi kiểu của một lớp
- 2. Có thể nghe các thay đổi đối với thuộc tính của đối tượng trong JavaScript không?
- 3. Javascript/chuyển đổi chuỗi kiểu CSS thành đối tượng JS
- 4. Thay đổi Javascript Kiểu Div
- 5. Entity Framework: Thừa kế, thay đổi kiểu đối tượng
- 6. Thay đổi lớp của đối tượng trong ActiveRecord
- 7. Thay đổi kiểu của ProgressDialog
- 8. Thay đổi kiểu của jqGrid
- 9. Thay đổi kiểu của AlertDialog
- 10. Đối tượng JavaScript DOM đối tượng jQuery
- 11. Thay đổi kiểu <input> trong IE với JavaScript
- 12. sửa đổi một đối tượng quy tắc css với javascript
- 13. chuyển đổi đối tượng DateTime của Net thành đối tượng Ngày Javascript
- 14. Swap hai đối tượng trong JavaScript
- 15. Thay đổi năm, tháng và ngày của đối tượng NSDate
- 16. Thay đổi thứ tự của các phím Đối tượng ....
- 17. Thay đổi tên của tải trong javascript
- 18. Tạo đối tượng trong javascript
- 19. Thay đổi kiểu thẻ body thông qua JavaScript
- 20. Listener cho bất động sản thay đổi giá trị trong một đối tượng javascript
- 21. thay đổi 'này' con trỏ của một đối tượng để chỉ đối tượng khác nhau
- 22. ngăn tải lại thẻ đối tượng khi thay đổi hiển thị (thuộc tính hiển thị kiểu)
- 23. Chuyển đổi đối tượng XMLDocument thành String trong Javascript
- 24. Lưu thay đổi đối tượng tên miền
- 25. Thay đổi kiểu hoạt ảnh của ViewPager
- 26. Làm thế nào để thay đổi lớp của một đối tượng động trong C#?
- 27. Các kiểu đối tượng ForeignKey Django hiển thị Tên trường thay vì giá trị đối tượng
- 28. Xây dựng đối tượng của kiểu dẫn xuất trong đối tượng Cơ sở
- 29. Javascript, xem [đối tượng HTMLInputElement]
- 30. JavaScript: tại sao thay đổi biến đối số thay đổi mảng `đối số` '?
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
.. ý 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