解析与创建的Javascript对象

Anr*_*nri 7 javascript json

这里和对象之间的实际区别是什么:pp2

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

var p2 = JSON.parse('{"Name":"John"}');
Run Code Online (Sandbox Code Playgroud)

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

PS.假设我从WebSocket获得了JSON字符串,无论如何我将不得不解析它.

Ant*_*ala 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;
}
Run Code Online (Sandbox Code Playgroud)

Person使用构造函数派生的所有内容都很容易获得.


bas*_*kum 2

主要区别在于,p是一个对象,即 的实例,Personp2是一个“普通”对象,即只是 的实例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
Run Code Online (Sandbox Code Playgroud)

或者:

console.log(p.constructor) //Person
console.log(p2.constructor) //Object
Run Code Online (Sandbox Code Playgroud)

2)使用instanceof运算符:

p instanceof Person //true
p2 instanceof Person //false
Run Code Online (Sandbox Code Playgroud)

3)与继承有关的一切

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

p --> Person --> Object

p2 --> Object
Run Code Online (Sandbox Code Playgroud)

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