设计模式之构造函数模式

构造函数模式概念

构造函数用于创建特定类型的对象–不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值。你可以自定义自己的构造函数,然后在里面声明自定义类型对象的属性或方法。

在JavaScript里,构造函数通常认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函数。通过new关键字来调用自定义的构造函数在构造函数内部,this关键字引用的是新创建的对象。

Show code

需求:我年纪大了,想有个小孩,1.这个小孩是我自己私有的,不要对谁都叫爸爸;2.我可能还要二胎,但是第二个小孩,但是我还没有想好这个小孩的名字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Baby(data){
if(!(this instanceof Baby)){
return new Baby(data);
}
this.name=data.name||'郝阿由'; //小孩的姓名
this.weight=data.weight||'7斤八两'; //小孩的体重
this._create=create;
}
function create() {
return "小孩的名字是"+this.name+"小孩的体重是"+this.weight;
}
var baby=new Baby({});
console.log( baby._create());

Review一下

  • 函数名首字母大写,用来区分构造函数和普通函数
1
function Baby(data)
  • 强制使用new,如果不用new,会把函数中this指到全局对象window上,如var baby=Baby()中baby 的type 是undefined,用window对象却可以调用构造函数Baby中的方法
1
2
3
if(!(this instanceof Baby)){
return new Baby(data);
}
  • 有的人可能会这样写 this.create= function () { return "小孩的名字是"+this.name+"小孩的体重是"+this.weight;}; ,这样写有一个问题,就是create()在每次创建对象的时候都重新定义,最好的方法是让所有baby类型的实例都共享这个create()方法, 还有一种实现更好的办法,在原型模式中会聊到
1
2
3
4
5
6
this._create=create;
}
function create() {
return "小孩的名字是"+this.name+"小孩的体重是"+this.weight;
}

By the way

JavaScript里有3中内置包装构造函数:Boolean(), String(), Number()

只有在想保留数值状态的时候使用这些包装函数:

1
2
3
4
5
var s = "s";//一个字符串
s.name = "s";
//对包装对象加了一个方法,执行完毕后立即销毁,第三行读不到 (聊ECMAScript时,会讲为什么)
console.log(typeof s.name); // "undefined"
1
2
3
4
5
var s = new String("s");//一个对象
s.name = "s";
// 可以正常访问新属性
console.log(typeof s.name); // "boolean"