// 创建自定义类型的最常见的方式,就是组合使用构造函数模式和原型模式,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。
// 这样的话,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大的节省了内存
// 另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["sum1","sum2","sum3"];
}
Person.prototype={
constructor:Person,
sayName:function(){
console.log(this.name);
}
}
var person1=new Person("summer",20,"enginner");
var person2=new Person("Bob",22,"Doctor");
person1.friends.push("sum4");
console.log(person1.friends); // ["sum1", "sum2", "sum3", "sum4"]
console.log(person2.friends); // ["sum1", "sum2", "sum3"]
console.log(person1.friends===person2.friends); // false
console.log(person1.sayName===person2.sayName); // true
//在上面这个例子中,实例属性都是在构造函数中定义的,而由所有实例共用的constructor和方法都是定义在原型中的。
// 而修改了person1.friends并不会修改person2.friends因为他们引用了不同的数组
// 这种 构造函数和原型混成的模式,是目前ECMAScript中使用最广泛、认同度最高的一种创建自定义类型的方法