首页 > 代码库 > JavaScript 面向对象的程序设计记录笔记2(设计模式)
JavaScript 面向对象的程序设计记录笔记2(设计模式)
以下为JavaScript高级程序设计 第六章面向对象的程序设计6.2节 创建对象(设计模式部分)读书记录。
1)工厂模式:
function createPerson(name, age, sex) {
var o = new Obejct();
o.age = age;
o.sex = sex;
o.name = name;
return o;
}
var person = createPerson(‘Tom‘, 12, ‘male‘);
var person = createPerson(‘Josn‘, 23, ‘male‘);
通过改方式,可无数次调用createPerson方法,传入三个参数,即可返回包含三个属性的对象。
2)构造函数方式:
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.seyName = function(){
alert(this.name);
}
}
var person1 = new Person(‘Tom‘, 23, ‘male‘);
var person2 = new Person(‘Json‘, 23, ‘male‘);
构造函数方式存在缺陷: 每次每个对象上的方法都会被实力化一次,即创建person1对象的时候,会实例化一次sayName对象,创建person2对象的时候,又会创建一次sayName对象,两次sayName对象不同。即:
console.log(person1.sayName == person2.sayName) ; // 输出false
3) 原型模式:(详见JavaScript高级程序设计第三版P147 - P158)
每个创建的函数上都有一个prototype(原型)属性, 这个属性是一个指针,指向一个对象,而指向的对象是包含由特定类型的所有实例共享的属性和方法。
function Person(){}
Person.prototype.name = ‘Tom‘;
Person.prototype.age = 24;
Person.protoType.sayName = function(){alert(this.name)};
var pserson1 = new Person();
person1.sayName(); // Tom
var person2 = new Person();
person2.sayName(); // Tom
console.log(person1.sayName == person2.sayName) ; // true
通过原型模式创建的对象,所有的对象都共用一个prototype属性指定的对象。
检验对象见是否存在Protptype关系,可用isPrototypeOf()方法,如果存在则返回true, 如:
console.log(Person.prototype.isPrototypeOf(person1)); // true
通过Object.getPrototypeOf()方法可返回指向原型对象的值,如:
console.log(Object.getPrototypeOf(person1.name)); // 输出Tom
注:每当代码读取某个对象的属性时,都会执行一次搜索,目标是具有给定名字的属性,首先从对象实例本身开始搜索,如果实例中存在具体给定的名字的属性,则返回改属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中找到了具体的给定值,则返回该属性的值。 也就是说在person1.sayName()的时候,会先后执行两次搜索,首先解释器会问?person1实例对象中是否存在sayName属性,答:没有,则继续搜索,指针指向的原型对象中进行搜索,解释器问?存在sayName属性嘛?答:存在,于是就读取存在原型对象中的函数。
当实例对象中存在的属性名与原型中存在的属性一致的时候,原型中对应的属性值会被屏蔽,如:
function Person(){}
Person.prototype.name = ‘Tom‘;
Person.prototype.age = 24;
Person.protptype.sayName = function(){alert(this.name);};
var person1 = new Person();
person1.name = ‘Json‘;
var person2 = new Person();
console.log(person1.name); // Json
console.log(person2.name); // Tom
注:delete操作符可删除对象实例上的属性,从而获得原型上的属性,如:
delete person1.name;
console.log(person1.name); // 输出Tom
hasOwnProperty()方法可判断一个属性是否存在实例对象中还是在原型中,如调用以上Person demo:
console.log(person1.hasOwnProperty(‘name‘)); // false, 来自原型;
person1.name = ‘Tom‘;
console.log(person1.hasOwnProperty(‘name‘)); // true, 来自实例
与hasOwnProperty()方法有区别的操作符in, 只要对象上存在该属性,不关属性是来自实例的,还是来自原型的,都会返回true。
JavaScript 面向对象的程序设计记录笔记2(设计模式)