基本模式
var people = new Object();
people.name='Nancy';
people.age = 20;
people.say = function(){
return ('hello!');
}
console.log(people.name,people.age,people.say());
优点:简单易学
缺点:复用性差,每一个都得自己创建
工厂模式
function creatObject(name, age){
var people = new Object();
people.name = name;
people.age = age;
people.say = function(){
return ('hello');
}
return people;//记住return
}
var p1 = creatObject('Nancy', 20);
var p2 = creatObject('Lucky', 20);
console.log(p1.name,p1.age,p1.say());
console.log(p2.name,p2.age,p2.say());
优点:能够调用一个函数就不断创建对象。
缺点:对象都有相同的say函数,在控制台测试p1.say===p2.say
是返回false,这说明它们虽然是相同的函数,但它们是分别存储在不同的地址中,这就会造成资源浪费。
构造函数
function creat(name,age){
this.name=name;//注意:这里用的是this
this.age =age;
this.say =function(){
console.log('hello');
}
}
var p3 = new creat('Nancy', 20);
var p4 = new creat('Lucky', 20);
console.log(p3.name,p3.age);
console.log(p4.name,p4.age);
优点:能够不断重复的创建对象,并且能够体现出原型对象和实例对象之间的关系p3 instanceof creat
。
缺点:每个对象中都有say函数,在控制台测试p3.say===p4.say
是返回false,这说明它们还是没有实现共享函数,从而造成资源的浪费。
原型对象
function people(){};
people.prototype.name = 'Nancy';//直接在原型上增加属性
people.prototype.age = 20;
people.prototype.say = function(){
return('hello!');//直接在原型上增加方法
};
var p3 = new people();
console.log(p3.name + " " +p3.age+" "+p3.say());
var p4 = new people();
console.log(p4.name + " " +p4.age+" "+p4.say());
优点:能够共享函数,属性等。p3.say===p4.say
返回true,说明是同一个地址。
缺点:构造函数时没有参数,所以创建对象有点麻烦。当多个实例对象共享时,可能会发生一些问题。
构造函数和原型模式混合
function people(name,age){
this.name=name;
this.age =age;
}
people.prototype.say=function(){
return 'hello';
};
var p1 = new people('Nancy',20);
console.log(p1.name,p1.age,p1.say());
var p2 = new people('Lucky',20);
console.log(p2.name,p2.age,p2.say());
这时候他们的say函数时共有的,因为他们都指向同一个原型,而且构造函数传入参数从而可以初始化具有自己的属性。
记录点滴,有错请帮忙纠正,嘻嘻~