面向对象的程序设计
工厂模式
用函数来封装以特定借口创建对象的细节。1
2
3
4
5
6
7
8
9
10function 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
10function 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
12function 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 | function hasPrototypeproperty(object,name){ |
只需判断属性不属于当前对象实例中,同时name in object(对象实例中有这个属性)也是true,则这个属性确实是原型属性。
object.keys()
将一个对象的所有属性放入一个数组,并返回。
object.getOwnPropertyNames()
在原型中,constructor属性是不能被枚举的,但这个方法会将对象的一切属性(无论是否能被枚举)拿出放入一个数组,并返回该数组。