第六章 面向对象的程序设计
6.2 创建对象
6.2.1 工厂模式
-
- 工厂模式
function createPerson(name, age, job) {
var o = new Object()
o.name = name
o.age = age
o.job = job
o.sayName = function () {
alert(this.name)
}
return o
}
var person1 = createPerson('Uzi', '21', 'loler')
person1.sayName()
- 缺点:不知道对象的类型
6.2.2 构造函数模式
-
-
- 构造函数模式
function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName() {
alert(this.name);
}
var person = **new** Person("Uzi","21","loler");
person.sayName();
-
-
用 new 操作符创建的函数就可以作为构造函数,没有用 new 创建的函数则和普通函数没有什么区别。
-
避免实例多个相同功能的 function,可以定义在外,但这也就失去了封装的意义。
-
构造函数模式可以检测类型 person instanceof Person // true
6.2.3 原型模式
-
- 原型模式
-
- 创建每个函数都有一个原型(peototype)属性,该属性是指针,指向一个对象,包含特定类型的所有实例共享的属性和方法;
-
Person.prototype.name = “Tom”;
-
-
所有原型都有一个 constructor 对象,指向构造函数。
-
实例是与原型对象连接,而不是和构造函数连接;
-
寻找属性和方法先从实例开始搜寻,没有则继续在原型中搜寻;
-
delete 可以删除实例属性 delete.person1.name;
-
in 操作符在能访问到指定属性时返回 true,hasOwnProtperty 方法,属性在实例中才返回 true;
-
- return !object.hasOwnProperty(name)&&(name in Object); 原型属性则返回 true
-
Object.keys(Person.prototype)返回所有可枚举属性的字符串数组;
-
Object.getOwnPeropertyNames(Person.prototype)无论是否可枚举均返回字符串数组
-
简单的语法
-
Person.prototype = {
name: 'Tom',
age: '17',
sayName: function () {},
}
11.
-
- 上面的写法重写了 prototype 对象,因此 constructor 也改变了,指向了 object 构造函数,需要手动改回 constructor:Person,
- 先创建了实例再重写 Prototype 会切断实例与新原型间的联系
- 不建议修改原生对象的原型
- 原型对象的缺点,比如数组,在实例中 push,会直接在原型中修改;
6.2.4/5/6/7
- 组合使用构造函数模式和原型模式
- 动态原型模式
- 寄生构造函数模式
- 稳妥构造函数模式