【问题标题】:name property of object, javascript对象的名称属性,javascript
【发布时间】:2014-05-16 22:48:08
【问题描述】:

我有一个关于对象的名称属性的问题,所以这是一种情况: 我使用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 但是当我分配对象时我又有了匿名对象。

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

库巴

【问题讨论】:

  • 我认为您的服务器代码在这里是相关的。你到底是怎么保存的?
  • 我认为名称在转换过程中丢失了,我使用的是 node.js express 框架和带有 POST 方法的 XMLHTTPRequest。它尽可能简单和标准:)

标签: javascript arrays json oop


【解决方案1】:

不,您不能序列化 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

【讨论】:

  • 这是一个解决方案,但我仍然有点困惑如何使用原型以及 oop 在 javascript 中的外观。
  • 要记住的最重要的一点是 JSON 和 JavaScript 不是一回事——JSON 是一种与语言无关的序列化格式(如 XML),恰好可以很好地映射到 JavaScript 数据结构。 IMO,JavaScript 最强大的特性是它的函数式编程特性,单独使用 JSON 是不可能的(正如您所发现的那样)。而且,是的,原型继承是一种不同的 OOP 思维方式,它确实需要按照自己的方式考虑——帮自己一个忙,永远不要尝试以 Java 为参考来理解它。
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2017-05-09
  • 2010-12-24
  • 2010-11-24
  • 2014-09-23
相关资源
最近更新 更多