提问人:Chris Pietschmann 提问时间:10/9/2008 最后编辑:Chris Pietschmann 更新时间:10/9/2008 访问量:19253
如何使用JSON创建继承自对象类型的对象?
How to use JSON to create object that Inherits from Object Type?
问:
我知道如何使用JSON创建对象,但是使用JSON创建特定对象类型的对象似乎并没有消失。
下面是一个 Object 并创建它的实例的示例:
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
现在,我想使用 JSON 创建一个新的 Person 对象,以便 GetFirstName 函数对其起作用。
这是我想做的事情(但这段代码不起作用):
var you = new Person() { FirstName: "Mike" };
// OR
var you = new Person{ FirstName: "Mike" };
有没有使用 JSON 来创建特定类型的对象?
更新:我使用 Person 对象的示例只是为了简化问题。事实上,我无法修改我需要创建实例的实际对象的构造函数。这些对象是第三方库的一部分。
更新:使用下面的一些建议,我能够找到一种方法来创建一个继承自原始对象的对象,并在其构造函数中接受JSON。这很整洁!
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!
答:
15赞
nickf
10/9/2008
#1
我不这么认为。如果我是你,我会在 Person 类上创建一个函数,以从 JSON 对象初始化。
function Person() {
this.loadFromJSON = function(json) {
this.FirstName = json.FirstName;
};
}
如果您事先不知道 JSON 对象表示哪个类,也许可以在 JSON 中添加一个额外的变量。
{ _className : "Person", FirstName : "Mike" }
然后有一个“构建器”函数来解释它。
function buildFromJSON(json) {
var myObj = new json["_className"]();
myObj.loadFromJSON(json);
return myObj;
}
更新:既然你说这个类是你无法更改的第三方库的一部分,你可以用原型来扩展这个类,或者编写一个函数,只在外部填充这个类。
例如:
Person.prototype.loadFromJSON = function(json) {
// as above...
};
或
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赞
tsimon
10/9/2008
这几乎就是Microsoft Ajax的工作方式。定义返回特定类型的方法。ajax 层查询该类型并创建一个 js 对象代理。然后,所有 json 调用都会返回一个“__type”参数,该参数告诉库使用哪个代理来实例化对象。
4赞
Aupajo
10/9/2008
#2
您可以允许 new Person() 接受一个对象作为参数来填充属性。
var you = new Person({ firstName: 'Mike' });
评论
0赞
Ates Goral
10/9/2008
事实上,这就是几个 JS 框架在构造时采用“选项”对象来覆盖对象的默认属性的方式。
2赞
harley.333
10/9/2008
#3
您可以从他们的对象派生对象。构造函数可以接受所需的对象,但以不受影响的方式调用其构造函数:
function yourWrapper(obj) {
theirObject.call(this);
for (var s in obj) {
this[s] = obj[s];
}
}
yourWrapper.prototype = new theirObject();
或者类似的东西:)
评论