JavaScript中的几种模式

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是所有实例都能共享的一个方法

此方法是使用最广泛的,认可度最高的

你可能感兴趣的:(javascript)