NB: Đăng viết theo phong cách của cách tôi giải quyết vấn đề này. Tôi không chắc chắn 100% nó có thể sử dụng trong trường hợp của OP.
Tôi tìm thấy bài đăng này trong khi tìm cách chuyển đổi các đối tượng được tạo trên máy chủ và được gửi đến máy khách bằng JSON/ajax.
Điều gì khiến tôi có hiệu quả trong cùng một tình huống như OP, một đối tượng mà tôi muốn chuyển đổi thành một hàm để có thể tạo các phiên bản của nó trên máy khách.
Cuối cùng tôi đã đưa ra với điều này, mà đang làm việc (cho đến nay ít nhất):
var parentObj = {}
parentObj.createFunc = function (model)
{
// allow it to be instantiated
parentObj[model._type] = function()
{
return (function (model)
{
// jQuery used to clone the model
var that = $.extend(true, null, model);
return that;
})(model);
}
}
nào sau đó có thể được sử dụng như:
var data = { _type: "Example", foo: "bar" };
parentObject.createFunc(data);
var instance = new parentObject.Example();
Trong trường hợp của tôi, tôi thực sự muốn để có các hàm kết hợp với các cá thể đối tượng kết quả, và cũng có thể truyền vào các tham số tại thời điểm khởi tạo nó.
Vì vậy, mã của tôi là:
var parentObj = {};
// base model contains client only stuff
parentObj.baseModel =
{
parameter1: null,
parameter2: null,
parameterN: null,
func1: function()
{
return this.parameter2;
},
func2: function (inParams)
{
return this._variable2;
}
}
// create a troop type
parentObj.createModel = function (data)
{
var model = $.extend({}, parentObj.baseModel, data);
// allow it to be instantiated
parentObj[model._type] = function(parameter1, parameter2, parameterN)
{
return (function (model)
{
var that = $.extend(true, null, model);
that.parameter1 = parameter1;
that.parameter2 = parameter2;
that.parameterN = parameterN;
return that;
})(model);
}
}
Và được gọi như sau:
// models received from an AJAX call
var models = [
{ _type="Foo", _variable1: "FooVal", _variable2: "FooVal" },
{ _type="Bar", _variable1: "BarVal", _variable2: "BarVal" },
{ _type="FooBar", _variable1: "FooBarVal", _variable2: "FooBarVal" }
];
for(var i = 0; i < models.length; i++)
{
parentObj.createFunc(models[i]);
}
Và sau đó họ có thể được sử dụng:
var test1 = new parentObj.Foo(1,2,3);
var test2 = new parentObj.Bar("a","b","c");
var test3 = new parentObj.FooBar("x","y","z");
// test1.parameter1 == 1
// test1._variable1 == "FooVal"
// test1.func1() == 2
// test2.parameter2 == "a"
// test2._variable2 == "BarVal"
// test2.func2() == "BarVal"
// etc
Tôi không hiểu sự cần thiết phải làm điều này. Bạn có thể đưa ra một ví dụ cụ thể về những gì bạn đang cố gắng đạt được không? – Geoff
Tôi không thể nghĩ đến việc sử dụng cho biểu mẫu thứ hai ngay bây giờ. Việc đầu tiên là phần nào hữu ích cho các biến tĩnh (mặc dù đóng cửa cũng sẽ làm). Tôi chủ yếu là hỏi vì tôi không thể nghĩ ra một cách để đạt được nó mà không cần sao chép các thuộc tính trên, mà là không may vì chúng là các hình thức song song. – mjs
Nghe có vẻ như bạn đang hy vọng rằng vì bạn có thể gán một phương thức cho một đối tượng Javascript, bạn cũng có thể gán một toán tử quá tải. Tôi không biết Javascript vì vậy tôi không biết câu trả lời, nhưng may mắn ... –