构造函数创建对象
function CreatePerson(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
this.sayHello = function(){
console.log(`我叫${this.name},今年${this.age}岁,性别${this.sex}`);
}
}
var p1 = new CreatePerson("小菲",18,"女");
var p2 = new CreatePerson("小菲",18,"女");
console.log(p1); //我叫小菲,今年18岁,性别女
console.log(p2); //我叫小菲,今年18岁,性别女
console.log(p1 == p2); //结果是:false
从上图可知,构造函数的创建方法一致,输入的个人资料也一致的情况下,结果两者并不相等;存在问题:原因在于对象互不相等,而且这种构造函数被多次new时,如果函数内部通过this设定了方法,那么多次new之后,会在内存中产生多个相同的功能,非常浪费内存,产生太多的多余方法,没有必要,为了节省资源,需要将这多个多余功能,修正,以节省内存。
解决方法
function CreatePerson(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
CreatePerson.prototype.sayHello = function(){
console.log(`我叫${this.name},今年${this.age}岁,性别${this.sex}`);
};
var p1 = new CreatePerson();
var p2 = new CreatePerson();
console.log(p1.sayHello == p2.sayHello); //结果是:true
prototype:专属于函数的一个属性,类型为对象,叫原型对象。
作用:为了给将来自身所在的构造函数被new出来的实例做父级使用的.
proto:专属于对象数据的一个属性,类型为对象,叫隐式原型。
作用:找父级,在这里就是寻找CreatePerson.prototype,找到父级添加的方法并使用,即不存在每次new的时候产生多个相同功能,因为这都是儿子们找父亲借的功能,所以儿子们用的功能都是同一个的功能。
特性:
1、当某个对象自身不具有某个属性或方法时,会找父级
2、当这个对象是被new出来的实例时,这个对象的父级(proto)就是当前被new的这个构造函数的prototype
意味着:通过构造函数找到prototype,添加的属性或方法,在将来new出来的实例的父级身上都可以找到。
总结
在使用构造函数方式创建对象时:
1、将 将来的属性,写在构造函数内部,通过this绑定给将来的实例 ;
2、将 将来的方法,写在构造函数的原型(prototype)上,会自动被将来的实例获取。