1.工厂模式
function createDog(name,age){
var d = new Object();
d.name = name;
d.age = age;
d.sayName = function(){
console.log(this.name);
}
return d;
}
2.构造函数模式
function Dog(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
console.log(this.name);
};
}
//下面看看几种使用方式
//当做构造函数使用
var d1 = new Dog("Sunli","28");
d1.sayName();
//当做普通函数调用
/*当在全局作用域中调用一个函时,
*this 对象总是指向GLobal对象
*在浏览器中就是window对象
*/
Dog("Sunli","28");
window.sayName();
//在另一个对象作用域中调用
var d = new Object();
Dog.call(d,"Sunli","28");
d.sayName();
但构造函数模式存在一个问题,由于在创造对象的时候,每一个新建的对象都是一个实例,这时候,每个方法都要在实例上重新创建一边,但由于这都是同样的一个方法,本质上来说我们希望的是同一个Function实例就可以解决的
原则上可以考虑以下的解决办法。
function Dog(name,age){
this.name = name;
this.age = age;
this.sayName = sayName;
}
var sayName = function(){
console.log(this.name);
}
但对于封装性来说,sayName作为全局的调用只供Dog来使用,有违全局作用域的初衷,所以,我们可以考虑使用构造函数模式+原型链的模式来创建对象.
4.组合使用构造函数+原型的模式
function Dog(name,age){
this.name = name;
this.age = age;
}
Dop.prototype = {
constructor : Dog,
sayName :function(){
console.log(this.name);
}
}
var d = new Dog("sunli",'28');
d.sayName();
var d1 = new Dog("sunliabc",'28');
d1.sayName();
//sayName是所有实例都能共享的一个方法
此方法是使用最广泛的,认可度最高的