工厂模式,构造函数模式,原型模式

面向对象的程序设计

工厂模式

用函数来封装以特定借口创建对象的细节。

1
2
3
4
5
6
7
8
9
10
function createPerson(name,sex,age){
var obj = new Object();
obj.name = name;
obj.sex = sex;
obj.age = age;
obj.sayName = function(){};
return obj;
}
var p1 = createPerson('z3','男',20);
var p2 = createPerson('z4','女',21);;

构造函数模式

构建一个对象,new关键字,传递参数,执行模板代码,返回对象。

1
2
3
4
5
6
7
8
9
10
function Person(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age;
this.sayName = function(){
alert(this.name);
};
}
var p1 =new Person('z3','男',20);
var p2 =new Person('z4','女',21);

需要注意的是,若要定义一个类的模板,一般约定俗成的把函数的名字第一个名字设为大写。

原型模式

原型的详细概念请看博客 原型与闭包。

1
2
3
4
5
6
7
8
9
10
11
12
function Person(name,sex,age){
person.prototype.name = 'z3';
person.prototype.age = 20;
person.prototypr.sayName = function(){
alert('我是原型对象的方法');
}
var p1 = new Person();
alert(p1.name); //z3
var p2 = new Person();
p2.name = 'w5';
alert(p2.name); //w5
}

每次代码读取一个对象的属性时,首先会进行一次搜索,搜索实例对象是name的属性,看看有没有,如果没有,再去实例所对应的原型对象里去搜索name属性,如果有就返回,如果没有返回undefinded。

判断一个原形是否存在于原型中

1
2
3
function hasPrototypeproperty(object,name){
return !object.hasPrototypeproperty(name) && name in object;
}

只需判断属性不属于当前对象实例中,同时name in object(对象实例中有这个属性)也是true,则这个属性确实是原型属性。

object.keys()

将一个对象的所有属性放入一个数组,并返回。

object.getOwnPropertyNames()

在原型中,constructor属性是不能被枚举的,但这个方法会将对象的一切属性(无论是否能被枚举)拿出放入一个数组,并返回该数组。