`
xj19891016
  • 浏览: 28780 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

JavaScript----创建可重用代码

阅读更多
1.1、原型式继承
    JavaScript对象的创建与继承使用了一套特别的模式,称为原型式继承。这种方法的原理是,对象的构造函数可以从其他对象中继承方法,它创建出一个原型对象后,所有其他的新对象都可以基于这个原型对象来构建。
    整个过程都是通过原型属性(prototype)来实现的(这是每个函数都有的一个属性,用作构造函数的函数自然也会有这个属性)。原型式继承的设计适用于单继承而非多继承。原型本身并不会从其他原型或者构造函数中继承属性,而属性都是从实际对象那里继承过来的。例
<script>
//为Person对象创建一个构造函数
function Person(name){
	this.name = name;
}
//给Person对象添加一个新方法
Person.prototype.getName = function(){
	return this.name;
};
//创建一个User对象的构造函数
function User(name, password){
	//注意,这里并没有支持方便的重载/继承,也就是说,
	//不能调用父类的构造函数
	//此处等于是给父类的name属性赋值,类似于java的super(name);
	//this.name = name;  
	Person.call(this, name);//调用父类的构造函数
	this.password = password;
}
//User对象继承所有Person对象的方法
User.prototype = new Person();
//添加一个新方法到User对象中
User.prototype.getPassword = function(){
	return this.password;
};
var user = new User("张三", "123");
alert(user.name);
alert(user.getName());
alert(user.password);
alert(user.getPassword());
</script>

    上面这个例子中最重要的一行是User.prototype = new Person();。分析一下这究竟是什么意思:User是对User对象构造函数的引用。new Person()使用Person构造函数创建了一个新的Person对象,然后把User构造函数的原型置为这个操作的结果。也就是说,每当你new User()时,得到的新User对象都会带有Person对象的所有的方法,如同通过操作new Person()得到的一样。
1.2、类式继承
    JavaScript里模拟类式继承的3个函数:
<script>
//简单的辅助函数,让你可以将新函数绑定到对象的prototype上
//这个将会添加一个公共方法到 Function.prototype 中,
//这样通过类扩展所有的函数都可以用它了。它要一个名称和一个函数作为参数。
//它返回 this 。当我写一个没有返回值的方法时,
//我通常都会让它返回 this 。这样可以形成链式语句。
Function.prototype.method = function(name, func){
	this.prototype[name] = func;
	return this;
};

//一个(相当复杂的)函数,允许你方便地从其他对象继承函数,
//同时仍然可以调用属于父对象的那些函数
//inherits 方法,它会指出一个类是继承自另一个类的。
//它必须在两个类都定义完了之后才能定义,但要在方法继承之前调用。
Function.method('inherits', function(parent){
	//记录我们目前所在父层次的级数
	var depth = 0;
	//继承父对象的方法
	var proto = this.prototype = new prent();

	//创建一个新的名为'uber'的"特权"函数,
	//调用它时会执行所有在继承时被重写的函数
	this.method('uber', function uber(name){
		var func;	//要执行的函数
		var ret;	//函数的返回值
		var v = parent.prototype;	//父对象的prototype

		//如果我们已经在某个'uber'函数之内
		if(depth){
			//上溯必要的depth,以找到原始的prototype
			for(var i = d; i > 0; i += 1){
				v = v.constructor.prototype;
			}

			//从该prototype中获得函数
			func = v[name];
		//否则这就是'uber'函数的第一次调用
		} else {
			//从prototype获得要执行的函数
			func = proto[name];

			//如果此函数属于当前的prototype
			if(func == this[name]){
				//则改为调用父对象的prototype
				func = v[name];
			}
		}

		//记录我们在继承堆栈中所在位置的级数
		depth += 1;

		//使用除第一个以外所有的arguments调用此函数。
		//(因为第一个参数是执行的函数名)
		ret = func.apply(this, Array.prototype.slice.apply(arguments, [1]));
		//恢复继承堆栈
		depth -= 1;
		//返回执行过的函数的返回值
		return ret;
	});
	return this;
});

//只继承父对象特定函数的函数。而非使用new parent()继承所有的函数
//swiss 方法对每个参数进行循环。每个名称,它都将 parent的原型中
//的成员复制下来到新的类的 prototype 中。
Function.method('swiss', function(parent){
	//遍历所有要继承的方法
	for(var i = 1; i < arguments.length; i += 1){
		//需要导入的方法名
		var name = arguments[i];
		//将此方法导入this对象的prototype中
		this.prototype[name] = parent.prototype[name];
	}
	return this;
});
</script>

    这三个函数到底提供了什么?
    Function.prototype.method:它提供了一个简单的方法,把函数与构造函数的原型关联起来。之所以有效,是因为所有的构造函数本身都是函数,所以能获得“method”这个新方法。
    Function.prototype.inherits:这一函数可以用于提供简单的单对象继承,它的代码主要围绕在任意对象方法中调用this.uber('methodName')为中心,并在这个uber方法去执行它要覆盖的父对象的方法。这是JavaScript继承模型中并未内建的部分。
    Function.prototype.swiss:这是.method()函数的增强版,可以用于从单一父对象获取多个函数。如果用在多个父对象上就能获得可用的多对象继承。
使用类式继承风格的JavaScript函数例子:
<script>
//创建一个新的Person对象构造函数
function Person(name){
	this.name = name;
}
//给Person对象添加一个新的方法
Person.method('getName', function(){
	return this.name;
});
var per = new Person("张三");
alert(per.getName());

//创建了一个新的User对象构造函数
function User(name, password){
	this.name = name;
	this.password = password;
}
//从Person对象继承所有的方法
User.inherits(Person);
//给User对象添加一个新的方法
User.method('getPassword', function(){
	return this.password;
});
//覆盖Person对象创建的getName方法,但通过uber函数来调用原有方法
User.method('getName', function(){
	return "子类的方法:" + this.uber('getName');
});
var user = new User("李四", "888888");
alert(user.getName());
alert(user.getPassword());
</script>

1.3 Base库
    Base库提供了一套比较直观的对象继承方法。
    下面体验一下Base一下重要的方面,它们对开发很有帮助。一个创建对象、单父对象继承和覆盖父类方法的例子。
<script type="text/javascript" src="Base.js"></script>
<script type="text/javascript">
//用Base库进行简单对象创建与继承的例子
//创建一个新的Person类
var Person = Base.extend({
	//Person类的构造函数
	constructor : function(name){
		this.name = name;
	},
	//Person类的一个简单方法
	getName : function(){
		return this.name;
	}
});
//创建一个新的继承自Person类的User类
var User = Person.extend({
	//创建User类的构造函数
	constructor : function(name, password){
		//这个函数实际上调用了父类的构造函数
		this.base(name);
		this.password = password;
	},
	//给User类提供了另一个简单的方法
	getPassword : function(){
		return this.password;
	}
});

var user = new User("李四", "888888");
alert(user.getName());
alert(user.getPassword());
</script>

    Base.extend(...):这个函数用于创建新的基本构造函数对象。这个函数接受的唯一参数是包含属性和值的简单对象,对象中的所有这些属性和值都被添加到要生成的对象里,作为其原型方法。
    Person.extend(...):这是Base.extend()语法风格的另一个版本,因为所有的构造函数都使用过.extend()方法来获得它们自身的.extend()方法,所以你也可以直接继承它们。上面例子就是通过直接继承原始Person构造函数的方法来创建User构造函数的。
    this.base();最后这个this.base()方法用来调用一个已被重载的父类方法。可以看到,这和Crockford的类式库提供的this.uber()函数很不一样,你不需要指定父类方法的名字。
1.4 Prototype库
    Pprototype的辅助函数,用于创建类、实现简单继承
<script type="text/javascript">
//创建一个名叫'Class'的全局对象
var Class = {
	//它只有一个函数,其作用是创建一个新的对象构造函数
	create : function(){
		//创建一个匿名的对象构造函数
		return function(){
			//调用它本身的初始化方法
			this.initialize.apply(this, arguments);
		};
	}
}
//给Object对象添加一个新的静态方法,
//它的作用是把属性从一个对象复制到另一个中
Object.extend = function(destination, source){
	//遍历所有要扩展的属性
	for(property in source){
		//然后将他们添加到目标对象中
		destination[property] = source[property];
	}
	
	//返回修改后的对象
	return destination;
}

//创建一个新的构造函数为空的Person对象
var Person = Class.create();

//将下面的函数复制到Person的prototype中
Object.extend(Person.prototype, {
	//这个函数由Person构造函数立即调用
	initialize : function(name){
		this.name = name;
	},
	//Person对象的简单函数
	getName : function(){
		return this.name;
	}
});

//创建一个新的构造函数为空的User对象
var User = Class.create();
//User对象继承了所有父类的函数
User.prototype = Object.extend(new Person(), {
	//将旧的初始化函数重载为新的
	initialize : function(name, password){
		this.name = name;
		this.password = password;
	},
	//给这个对象添加一个新的函数
	getPassword : function(){
		return this.password;
	}
});

var user = new User("王五", "888888");
alert(user.getName());
alert(user.getPassword());
</script>
分享到:
评论

相关推荐

    javascript - javascript tutorial

    **JavaScript中的注释**用于记录代码的目的或逻辑,有助于代码的维护。单行注释使用`//`,多行注释使用`/* */`。例如: ```javascript // 这是一条单行注释 /* 这是多行注释 可以跨越多行 */ ``` 通过以上介绍,...

    javascript-tree-menu

    JavaScript Tree Menu是一种常见的网页交互元素,它用于在网站上创建可折叠、层次分明的菜单结构。这个技术基于JavaScript,一种广泛使用的客户端脚本语言,它允许动态地更新和操作HTML内容,提供更丰富的用户交互...

    javascript-978-1-7835-5855-1:使用JavaScript进行React式编程

    React是由Facebook开发的一个用于构建用户界面的JavaScript库,尤其适用于构建可重用且组件化的应用程序。React的核心理念是通过声明式编程方式,使开发者能够轻松地描述应用在不同状态下的视图应该如何呈现。 描述...

    JavaScript-code_sampe

    - **模块化**:ES6引入的模块系统(import和export关键字)允许代码分隔和重用,提高可维护性。 总结来说,这个压缩包“JavaScript-code_sample”很可能是针对JavaScript初学者或开发者的一个学习资源,包含了从...

    build-a-javascript-framework.pdf

    它们可以提高代码的可重用性,并降低代码的复杂度。 "Initialisation"章节则关注框架的初始化过程。初始化阶段是框架启动的关键,它涉及加载配置、设置全局变量、注册插件等。良好的初始化设计能够确保框架在各种...

    JavaScript-Library:可重用的Javascript组件

    这些库通常由一组可重用的JavaScript函数和对象组成,它们封装了常见的编程任务,如DOM操作、动画效果、事件处理、Ajax交互等。JavaScript库允许开发者避免重复造轮子,提高代码质量和效率,同时降低了学习曲线,...

    javascript-quiz:一个用 javascript 编码的 javascript 测验

    2. 控制流程:包括条件语句(if...else)、循环(for、while)、switch语句,以及函数(用于封装可重用的代码块)。 3. DOM操作:JavaScript可以查找、添加、删除和修改DOM元素,这对于创建动态网页至关重要。例如...

    Object-oriented-javascript

    《面向对象的JavaScript》这本书旨在教授读者如何创建可扩展、可重用、高质量的JavaScript应用程序和库。书中应该包含了面向对象编程(OOP)的基础概念,比如封装、继承和多态性,并且讲解了如何在JavaScript中实现...

    Object-Oriented JavaScript

    - **模块化**:将大型项目分解成小的、独立的功能模块,有助于管理和重用代码。 - **组件化**:构建独立的、可复用的UI组件,这些组件可以通过属性和事件与其他部分交互。 - **设计模式**:采用成熟的设计模式如...

    javascript经典特效---纯JavaScript时钟.rar

    为了提高可维护性和可重用性,可以将时钟的逻辑封装在一个自定义函数中,然后在需要的地方调用该函数。 总的来说,纯JavaScript时钟是一个很好的学习项目,它涵盖了基本的日期和时间处理、定时器以及DOM操作等多个...

    Javascript教程--从入门到精通.doc

    3.2节介绍了函数,函数是JavaScript中可重用的代码块,可以封装复杂操作并提高代码的模块化。3.3部分讨论了变量的作用域,理解变量在何处可被访问至关重要。3.4节涉及的是异常处理,通过try...catch结构来捕获和处理...

    javascript-prework:javascript-prework-kodilla

    3. **函数**:理解函数的定义、参数传递和返回值,以及如何使用函数来封装可重用的代码。 4. **DOM操作**:文档对象模型(DOM)是HTML和XML文档的编程接口。学习如何通过JavaScript选择、修改和添加DOM元素,例如...

    JavaScript教程--从入门到精通

    函数可以封装可重用的代码,减少代码冗余。你将学习如何声明函数、传递参数、返回值以及作用域的概念,包括全局作用域和局部作用域。 在JavaScript中,对象是其核心特性。对象是由键值对组成的,可以通过字面量语法...

    javascript网页开发-张孝祥.pdf

    - **Web组件**:一种将UI组件化的方法,允许开发者创建可重用的定制元素,提高代码复用性和可维护性。 ### 结论 JavaScript作为现代网页开发不可或缺的一部分,其重要性不言而喻。掌握基本语法和概念的同时,还需要...

    JavaScript-30-Project:纯香草JavaScript项目

    3. **函数**:函数是可重用的代码块,可以接受参数并返回值。你还将学习到箭头函数和函数表达式等高级特性。 4. **对象与原型链**:理解JavaScript的对象创建方式,包括字面量语法和构造函数,以及原型和原型链的...

    Interactive-JavaScript-Tutorial:关于JavaScript的交互式教程

    函数是JavaScript中的重要组成部分,可以封装可重用的代码段。它们可以接受参数,并可能返回值。函数有助于组织代码,提高可维护性。 JavaScript的对象则是一种数据结构,可以存储键值对。通过创建对象,开发者可以...

    JavaScript-Essential-Training:最近,我发布了有关JavaScript的系列教程,人们问我源代码-Ask the source code

    3. **函数**:函数是JavaScript中的可重用代码块,允许我们封装行为。了解函数的定义、参数、返回值,以及函数表达式(匿名函数和箭头函数)是学习JavaScript的重要部分。 4. **对象**:JavaScript的对象是键值对的...

    javascript实例应用---综合类.rar

    3. **函数**:函数是可重用的代码块,可以接受参数并返回值。函数表达式、函数声明、箭头函数和默认参数都是JavaScript中函数的常见形式。 4. **对象与原型链**:JavaScript对象是键值对的集合,可以通过花括号{}...

    javascript-978-1-7889-9958-8:掌握 JavaScript 中的简洁代码 [视频]

    8. **模块化**:了解CommonJS和ES6模块系统,如何通过import和export来组织和重用代码。 9. **错误处理**:学习如何有效地捕获和处理运行时错误,以及try...catch语句的使用。 10. **性能优化**:探讨如何通过缓存...

Global site tag (gtag.js) - Google Analytics