第六章 面向对象的编程
6.2 创建对象
基础模式(见笔记02)
工厂模式
构造函数模式
原型模式
升级模式
组合使用构造函数和原型模式
动态原型模式
寄生构造函数模式
稳妥构造函数模式
2.1 组合使用构造函数和原型模式
定义引用类型的默认模式
function Person (name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Count"];
}
Person.prototype = {
constructor : Person,//声明constructor指向
sayName : function(){
alert (this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //Shelby,Count,Van
alert(person2.friends); //Shelby,Count
alert(person1.friends === person2.friends); // false
alert(person1.sayName === person2.sayName); // true
构造函数模式用于定义实例属性;
原型模式用于定义方法和共享的属性。
优点:每个实例都会有实例属性的副本,又共享着方法,并支持向构造函数传递参数;最大限度节省了内存。
2.2 动态原型模式
function Person (name , age , job ){
// 属性
this.name = name ;
this.age = age;
this.job = job;
//方法
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert (this.name);
};//仅执行一次,第二次调用时构造函数的原型已初始化。
}
}
var friend = new Person ("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas"
if 语句,只有在初次调用构造函数时才会执行仅且执行一次;
if语句检查的是初始化后应该存在的任何属性和方法, 条件不成立时,所执行的代码中,可以添加多个方法;
有混合模式的优点,并把所有信息都封装在了构造函数中;
初始化原型 后所做的修改,能在所有实例中得到反馈。
2.3 寄生构造函数模式
创建一个函数,用来封装构创建对象的代码,并返回新创建的对象。
为实例创造构造函数:
function Person (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 = new Person("Nicholas", 29, "Software Engineer");
person1.sayName (); //"Nicholas"
与工厂函数的区别:
- 内部所封装的函数称为构造函数;
- 适用new操作符创建实例对象。
为对象创建构造函数;
function SpecialArray (){
//创建数组
var values = new Array();
//添加值
values.push.apply(values, arguments);
// 添加方法
values.toPipedString = function(){
return this.join("|");
};
//返回数组
return values;
}
var colors = new SpecialArray("red", "blue", "green");
alert(colors.toPipedString()); // "red|blue|green"
alert(colors instanceof SpecialArray); //false
alert(colors instanceof Object); //true
- 因Array构造函数无法直接修改,则通过封装构造函数,将数组以函数值的形式返回;
- 返回的对象与构造函数和构造函数的原型没有任何关系;
- Object .push.apply()。
2.4 稳妥构造函数模式
稳妥对象,指的是没有公共属性,且其方法也不使用this的对象
function Person (name, age, job){
//创建要返回的对象
var o = new Object();
//可以在这里定有私有变量和函数
o.sayName = function(){
alert(name)
};
//返回对象
return o;
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
person1.sayName (); //"Nicholas"
除了调用sayName()方法外,没有其他方式访问其数据成员。
稳妥构造函数模式创建的对象与构造函数之间没有关系。
看了一篇博文,关于稳定构造函数讲得比较详细:JS之稳妥构造函数模式and静态私有变量。(这样链接不违规吧)
把对象的创建重新又梳理了一边,花费了一天多的时间,相比第一次的头晕眼花,每次重看都有一些新的认识,在相同的字面上,总能找到之前未曾发现的东西(也说明我心太大…看书没沉下心)。
要培养一种良好思维方式,看书时要抱着目的去寻找解决方式,这样理解应该比较深刻。