解析与创建的Javascript对象

时间:2013-08-13 09:42:58

标签: javascript json

此处pp2个对象之间的实用差异是什么:

var Person = function(name) { this.Name=name; }
var p = new Person("John");

var p2 = JSON.parse('{"Name":"John"}');

当我更好地创建new Person()并从已解析的JSON复制值时,有哪些情况,而不是使用解析后的JSON对象,因为我会使用Person的实例?

PS。假设我从WebSocket获得了JSON字符串,无论如何我都要解析它。

6 个答案:

答案 0 :(得分:6)

p和p2之间的区别在于p2的内部原型是Object.prototype,而p的原型是Person.prototype;对于p,您可以通过向Person添加方法为所有Person.prototype个对象添加常用方法或属性。

因此,你可以让JSON格式包含诸如“givenName”,“surname”“title”之类的字段,并且通过使用new Person方法,你可以有一个方法:

Person.prototype.getFullName = function () {
    return this.title + " " + this.givenName + " " + this.surname;
}

随时可用的所有Person使用构造函数派生。

答案 1 :(得分:2)

主要区别在于它们具有不同的原型链:

p.constructor ->  function (name) { this.Name=name; }
                  (the Person function)
chain: p -> Person -> Object

p2.constructor -> function Object() { [native code] } 
                  (the standard object constructor)
chain: p2 -> Object

如果您需要正确的原型链(例如,您想要继承Person.prototype上有多个方法),请使用new Person()构造。如果您有一个JSON字符串(例如来自ajax调用),您拥有所有数据(并且不需要Person作为原型),请使用JSON.parse,否则请使用好的ol'纯:

var p2 = {Name:'John'};

旁注:

var p2 = JSON.Parse("{Name:'John'}");

错了,需要:

var p2 = JSON.parse('{"Name":"John"}');

答案 2 :(得分:2)

主要区别在于p是一个对象,它是Person的实例,而p2是一个“普通”对象,它只是{{1}的一个实例}。

这种差异何时重要?

1)访问原型属性:

Object

或者:

var Person = function(name) { this.Name=name; }
Person.prototype.getName = function () {
    return this.Name;
};

p.getName() //works fine
p2.getName() //Error since getName is not defined

2)使用console.log(p.constructor) //Person console.log(p2.constructor) //Object 运算符:

instanceof

3)与继承有关的一切

所有这三点基本上都可以追溯到原型链,这两种方式看起来都是这样的:

p instanceof Person //true
p2 instanceof Person //false

现在,既然你有这个构造函数,我建议你总是使用它,因为如果你把p --> Person --> Object p2 --> Object 个对象与普通对象混合起来会很麻烦。如果你真的只想要一个具有Person属性的对象,那么你可以在两种方式都很好,但只要它变得更复杂一点,你就会遇到严重的问题。

答案 3 :(得分:1)

解析版本基本上都是相同的,增加了打破文本和翻译它的开销(这不是很慢)。 我认为使用第一种方法编程更好,你不希望在代码中使用原始JSON:)

JSON.parse将根据您提供的数据创建一个非常基本的对象,这没有问题

使用第一种方法可以预先定义和扩展对象,为其提供方法和属性,以便更好地使用它包含的数据。

答案 4 :(得分:1)

简单地说,p是Person对象,p2只是一个对象文字。它们都有不同的原型,命名为p的Person原型和p2的Object原型。

第一种情况定义了一个“类”,您可以使用“class”作为新对象的构造函数来创建新对象。

第二种情况创建一个对象文字并将值分配给指定的键。

答案 5 :(得分:0)

你的陈述

var p2 = JSON.Parse("{Name:'John'}");

只是一种效率低下的方法:

  var p2 = {Name:'John'};