一,原型
前面介绍了通过工厂方法和构造函数来创建对象,工厂方法在创建大量对象时内存消耗较大,构造函数可以减少内存消耗。但是在构造函数内部添加方法也会消耗大量内存,将方法写在构造函数外部,写在全局作用域又会污染全局作用域命名空间(同一个项目可能别人函数的名字跟自己的取得一样),也不安全。因此我们来了解一个新的概念原型prototype。
当我们访问对象的一个属性或方法时,它会先在对象中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则使用。
创建构造函数时,可以将这些 对象共有的属性和方法,同意添加到构造函数的原型对象中,这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法。
原型对象也是对象,是对象就有原型,原型对象里有__proto__;当我们在使用一个对象的属性或方法时,会先在自身中寻找,自身中如果有则直接使用;如果没有则去原型中寻找,如果有则使用;如果没有则则去原型的原型中寻找。直到找到Object对象的原型,Object对象的原型没有原型,如果在Object中依然没有找到则返回undefined。
当我们查找某个对象是否具有某个属性时,person.hello;先去自身中寻找,如果有则直接使用;如果没有则去原型prototype中寻找,有则使用;如果没有则去原型的原型中寻找,直到找到Object对象的原型,Object对象的原型没有原型,如果在Object对象的原型中依然没有找到则返回undefined。
二,toString()
在前面讲到类型转换的时候,我们有提到toString()方法,将其它数据类型转换为字符串,X.toString()方法不会影响到原变量,但是null和undefined没有toString()方法。
此时只有per的返回值改变,如果希望所有实例对象的toString()的返回值度修改了,我们就需要在构造函数的原型上来修改