这里和对象之间的实际区别是什么: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字符串,无论如何我将不得不解析它.
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使用构造函数派生的所有内容都很容易获得.
主要区别在于,p是一个对象,即 的实例,Person而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
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属性的对象,那么两种方式都可以,但是一旦它变得更复杂一点,你就会遇到严重的问题。