《js高级程序设计》三——4组合使用构造函数模式和原型模式 5动态原型模式 6寄生构造函数模式 7稳妥构造函数模式

组合使用构造函数模式和原型模式

——使用广泛、认同度高的一种创建自 定义类型的方法

构造函数模式用于定义实例属性
原型模式用于定义方法和共享的属性

结果,每个实例都会有自己的一份实例属性的副本, 但同时又共享着对方法的引用,大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参 数;可谓是集两种模式之长。

function Person(name, age, job){
 	this.name = name;
 	this.age = age;
 	this.job = job;
 	this.friends = ["Shelby", "Court"];
}
Person.prototype = {
 	constructor : Person,
 	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 
  1. 动态原型模式
    在这里插入图片描述
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(); 

只在 sayName()方法不存在的情况下,才会将它添加到原 型中
这段代码只会在初次调用构造函数时才会执行。此后,原型已经完成初始化

采用这种模式创建的对象,还可以使 用 instanceof 操作符确定它的类型。

使用动态原型模式时,不能使用对象字面量重写原型。前面已经解释过了,如果 在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系

  1. 寄生构造函数模式

通常,在前述的几种模式都不适用的情况下,可以使用寄生(parasitic)构造函数模式

这种模式 的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象;但 从表面上看,这个函数又很像是典型的构造函数

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 friend = new Person("Nicholas", 29, "Software Engineer");
// 工厂模式:var friend = Person("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas" 

除了使用 new 操作符并把使用的包装函数叫做构造函数之外,这个模式跟工厂模式其实 是一模一样的

构造函数在不返回值的情况下,默认会返回新对象实例。而通过在构造函数的末尾添加一个 return 语句,可以重写调用构造函数时返回的值

这个模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊 数组。由于不能直接修改 Array 构造函数,因此可以使用这个模式。

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" 

push()方法(用构造函数接收到的所有参数)初始化了数组的值

返回的 对象 与 构造函数 或者与 构造函数的原型属性 之间没有关系;也就是说,构造函数返回的对象与在构造函数外部创建的对象没有什么不同。为此, 不能依赖 instanceof 操作符来确定对象类型。
由于存在上述问题,我们建议在可以使用其他模式的情 况下,不要使用这种模式。

  1. 稳妥构造函数模式

道格拉斯·克罗克福德(Douglas Crockford)发明了 JavaScript中的 稳妥对象(durable objects) 这 个概念。

所谓稳妥对象,指的是没有公共属性,而且其方法也不引用 this 的对象
稳妥对象适合在 一些安全的环境中(这些环境中会禁止使用 this 和 new),或者在防止数据被其他应用程序(如 Mashup 程序)改动时使用

稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同:
一是新创建对象的 实例方法不引用 this;
二是不使用 new 操作符调用构造函数

function Person(name, age, job){
	//创建要返回的对象
 	var o = new Object();
	//可以在这里定义私有变量和函数
 	//添加方法
 	o.sayName = function(){
 		alert(name);
 	};
 	//返回对象
 	return o;
} 

在以这种模式创建的对象中,除了使用 sayName()方法之外,没有其他办法访问 name 的值。 可以像下面使用稳妥的 Person 构造函数

var friend = Person("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas" 

变量 friend 中保存的是一个稳妥对象,而除了调用 sayName()方法外,没有别的方式可 以访问其数据成员。

即使有其他代码会给这个对象添加方法或数据成员,但也不可能有别的办法访问传 入到构造函数中的原始数据。稳妥构造函数模式提供的这种安全性,使得它非常适合在某些安全执行环 境——例如,ADsafe(www.adsafe.org)和 Caja(http://code.google.com/p/google-caja/)提供的环境—— 下使用。

与寄生构造函数模式类似,使用稳妥构造函数模式创建的对象与构造函数之间也 没有什么关系,因此 instanceof 操作符对这种对象也没有意义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值