对象的名称属性,javascript

时间:2014-05-16 22:48:09

标签: javascript arrays json oop

我有关于对象名称属性的问题,所以这是一种情况: 我用prototype.constructor创建了自定义对象(称为Notka),并且还添加了一些原型的方法,然后将其推入对象数组,然后将数组转换为json对象并将其保存在外部服务器上。到目前为止一切都很好。

当我从外部服务器获取它作为json并将其转换为对象数组时,对象的名称属性将丢失,并且即时获取不识别其方法的匿名对象。我有一些想法,以避免将数组转换为对象和反之并避免所有这些混乱但我要求出于好奇,有没有办法保留对象的名称或更改匿名对象的名称。

我尝试创建自定义类型的新对象,例如:

var nt = new Notka(); // my custom object
nt = tab[index]; // tab is a array containing objects fetched from external sever

但它不起作用,新创建的Notka有constructor.name Notka但是当生病分配对象时我又有了匿名对象。

提前感谢您的任何答案:)

库巴

1 个答案:

答案 0 :(得分:0)

不,你不能序列化一个JSON对象并保留一个函数的名称或方法(这就是Notka,而不是一个简单的对象)。将此对象保存到数据库时,首先将其转换为字符串。您的数据库得到的是JSON.stringify( nt );的输出。所以,当它回到你身边并被解析时,除了JSON standard中允许的内容之外,它都会丢失所有内容,这与JavaScript,node.js或其他内容不同。它更简单,只允许某些数据类型(基本上是普通对象,数字,字符串和数组)。

听起来你可能想修改你的构造函数,以便你可以做这样的事情:

var nt = new Notka( tab[index] );

如果您只是nt = tab[index],那么您正在销毁之前创建的原始Notka对象的引用。

所以也许

var Notka = function( obj ) {
    for ( var i in obj )
        this[i] = obj[i];
};

Notka.prototype.multiply = function( times ) {
    return this.someProperty * times;
};

var tab = [{
    someProperty: 4,
    another: "notka!"
}, {
    someProperty: 15,
    another: "lalalala"
}];

var nt = new Notka( tab[0] );
nt.multiply( 5 );

// 20