您的位置:首页 > Web前端 > JavaScript

JavaScript中的几种模式

2016-02-02 11:33 567 查看
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是所有实例都能共享的一个方法


此方法是使用最广泛的,认可度最高的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息