原型这个东西,就是让实例共享它的方法和属性,但是有个缺点,就是push一个新东西的时候,另外一个实例也会跟着改变,所以用构造函数和原型模式组合使用来避免这个问题。
看代码
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["323", "34"];
}
Person.prototype = {
constructor: Person,
sayName: function() {
console.log(this.name);
}
}
var person1 = new Person("111", 22, "555");
var person2 = new Person("222", 23, "666");
person1.friends.push("32311");
console.log(person1.friends); // [323,34,32311];
console.log(person2.friends); //[232,34];
console.log(person1.friends === person2.friends) //false
console.log(person1.sayName === person2.sayName) //true
这个例子里面,实例属性由构造函数定义,而所有实例共享的属性constructor和方法sayName则是在原型中定义,person1 push了一个新东西,并不会影响person2。因为他们引用的是不同的数组。