摘自《JavaScript高级程序设计》(第三版),小加些料,针对ES5,帮助理解。ES6中已增加class关键字。
1. 构造函数和原型的区别
● “构造函数”中定义实例属性。实例属性由实例定义,不同实例之间互不影响,某一个实例修改了自己的实例属性,其他实例该属性不变。
//构造函数
function Person (name, age, job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["大哈","二哈"];
}
● “原型”中定义方法和共享属性。某一个实例修改了共享属性,其他实例会自动跟着变动。
function Person(){
}
Person.prototype={
constructor:Person,
name:"大哈",
age:3,
job:"卖萌",
friends:["二哈","三哈"],
sayName:function(){
alert(this.name);
}
};
var person1=new Person();
var person2=new Person();
person1.friends.push("主人");
alert(person1.friends); //"二哈,三哈,主人"
alert(person2.friends); //"二哈,三哈,主人"
alert(person1.friends===person2.frineds); //true
2. 采用【构造函数+原型】创建对象
ECMAScript广泛使用下述方法创建自定义类型对象。
//构造函数:定义实例属性
function Person (name, age, job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["大哈","二哈"];
}
//原型函数:定义共享属性、方法
Person.prototype = {
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person1 = new Person("大喵",3,"玩线团");
var person2 = new Person("二喵",2,"抓沙发");
person1.friends.push("主人");
alert(person1.friends); //"大哈,二哈,主人"
alert(person2.friends); //"大哈,二哈"
alert(person1.friends===person2.friends); //false
alert(person1.sayName===person2.sayName); //true