7

和对象之间的实际区别是什么: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 字符串,无论如何我都必须解析它。

4

6 回答 6

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使用构造函数派生的所有 s 都是现成的。

于 2013-08-13T09:48:32.357 回答
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"}');
于 2013-08-13T09:49:06.620 回答
2

主要区别在于它p是一个对象,它是Personwhile的一个实例,它p2是一个“普通”对象,它只是一个Object.

这种差异何时重要?

1)访问原型属性:

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

或者:

console.log(p.constructor) //Person
console.log(p2.constructor) //Object

2)使用instanceof运算符:

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

3)与继承有关的一切

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

p --> Person --> Object

p2 --> Object

现在,既然你有这个构造函数,我建议你总是使用它,因为如果你将Person对象与普通对象混合,它会变得非常混乱。如果您真的只想要一个具有Name属性的对象,那么两种方式都可以,但是一旦它变得更复杂一点,您就会遇到严重的问题。

于 2013-08-13T09:59:54.033 回答
1

解析版本基本上与分解文本和翻译它的额外开销相同(这并不慢)。我会认为使用第一种方法更好地编程,你不希望原始 JSON 挂在你的代码周围:)

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

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

于 2013-08-13T09:47:43.220 回答
1

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

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

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

于 2013-08-13T09:54:05.770 回答
0

你的陈述

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

只是一种低效的方法:

  var p2 = {Name:'John'};
于 2013-08-13T09:48:54.570 回答