`
jaesonchen
  • 浏览: 313631 次
  • 来自: ...
社区版块
存档分类
最新评论

javascript encapsulation 封装

 
阅读更多
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>encapsulation.html</title>
	
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
	<script type="text/javascript" src="../js/jquery-1.11.3.js"></script>

  </head>
  
  <body>
	<div id="div"></div>
	<script type="text/javascript">
	// <![CDATA[
		//如果你需要在没有硬编码的window标识符下访问全局对象,你可以在任何层级的函数作用域中做如下操作:
		var global = (function () {
			return this;
		})();
		function show(str) {
			$("#div").append($("<p></p>").text("" + str));
		}
		
	
		//对象定义:ECMA-262把对象定义为:“无序属性的集合,其中属性可以包括基本值、对象或者函数”。
		//创建对象:每个对象都是基于一个引用类型创建的。
		//这个引用类型可以是原生类型(Object, Array, Date, RegExp, Function, Boolean, Number, String),也可以是自定义类型。
		
		//1、构造函数模式
		function Person(name, age) {
		    this.name = name;
		    this.age = age;
		    this.sayName = function() {
		        show(this.name);
		    };
		}
		//通过以上构造函数使用new操作符可以创建对象实例。
		var zhangsan = new Person('zhangsan', 20);
		var lisi = new Person('lisi', 20);
		zhangsan.sayName();			//zhangsan
		lisi.sayName();				//lisi
		
		//通过new创建对象经历4个步骤
		//a、创建一个新对象;[var o = new Object();]
		//b、将构造函数的作用域赋给新对象(因此this指向了这个新对象);[Person.apply(o)]  [Person原来的this指向的是global]
		//c、执行构造函数中的代码(为这个新对象添加属性)
		//d、返回新对象。
		//通过代码还原new的步骤:
		function createObject(P) {
		    var o = new Object();
		    var args = Array.prototype.slice.call(arguments, 1);
		    o.__proto__ = P.prototype;
		    P.prototype.constructor = P;
		    P.apply(o, args);
		    return o;
		}
		//测试新的创建实例方法
		var wangwu = createObject(Person, 'wangwu', 20);
		wangwu.sayName();		//wangwu
		
		//2、原型模式
		//原型对象概念:无论什么时候,只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。
		//在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向 prototype 属性所在函数的指针。
		//而通过这个构造函数,可以继续为原型对象添加其他属性和方法。
		//创建了自定义的构造函数后,其原型对象默认只会取得 constructor 属性;至于其他方法,则都从 Object 继承而来。
		//当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(__proto__),指向构造函数的原型对象。
		//构造函数的原型对象,主要用途是让多个对象实例共享它所包含的属性和方法。
		
		Person.prototype.country = 'chinese';
		Person.prototype.sayCountry = function() {
		    show(this.country);
		};
		var zs = new Person('zhangsan', 20);
		var ls = new Person('lisi', 20);
		zs.sayCountry();		//chinese
		ls.sayCountry();		//chinese
		show(zs.sayCountry === ls.sayCountry); 	//true
		
		//3、组合使用构造函数模式和原型模式
		//这种模式是使用最广泛、认同度最高的一种创建自定义类型的方式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。
		//这样,每个实例都有自己的一份实例属性的副本,同时有共享着对方法的引用,最大限度的节省了内存。

		//封装私有属性和方法
		var Book = (function() {
			// Private static attributes.
			// 私有静态属性
			var numOfBooks = 0;
			// Private static method.
			// 私有静态函数
			function checkIsbn(isbn) {
				//	... 
				return isbn != null;
			};
			// Return the constructor.  
			// 返回构造器
			return function(newIsbn, newTitle, newAuthor) {
				// Private attributes. 
				// 私有属性
				var isbn, title, author;
				// Privileged methods.
				// 特权函数是指可以访问私有属性的函数
				this.getIsbn = function() {
					return isbn; 
				};
				this.setIsbn = function(newIsbn) {
					if(!checkIsbn(newIsbn))
						throw new Error('Book: Invalid ISBN.');
					isbn = newIsbn; 
				};
		
				this.getTitle = function() {
					return title;
				};
				this.setTitle = function(newTitle) {
					title = newTitle || 'No title specified'; 
				};
		
				this.getAuthor = function() {
					return author;
				};
				this.setAuthor = function(newAuthor) {
					author = newAuthor || 'No author specified';
				};
		
				// Constructor code.
				// Keep track of how many Books have been instantiated 
				numOfBooks++;
				// with the private static attribute.
				if(numOfBooks > 50)
					throw new Error('Book: Only 50 instances of Book can be created.');
				this.setIsbn(newIsbn);
				this.setTitle(newTitle);
				this.setAuthor(newAuthor);
			};
		})();
		
		// Public static method.  
		Book.convertToTitleCase = function(inputString) {
			//...
		};
		
		// Public, non-privileged methods. 
		// 非特权函数是指不需要访问私有数据的公共方法
		Book.prototype = {
			display: function() {
				show("isbn = " + this.getIsbn() + ", title = " + this.getTitle() + ", author = " + this.getAuthor());
			}
		};
		
		Book.prototype.constructor = Book;
		try {
			var theHobbit;
			for(var i = 0; i < 60; i++)
				theHobbit = new Book('0-395-07122-4-' + i, 'The Hobbit', 'J. R. R. Tolkien');
		} catch (error) {
			show(error);	//Error: Book: Only 50 instances of Book can be created.
		}

		theHobbit.display();	//isbn = 0-395-07122-4-49, title = The Hobbit, author = J. R. R. Tolkien

	// ]]>
	</script>
  </body>
</html>

 

分享到:
评论

相关推荐

    JS封装和继承-入门级

    ### 封装(Encapsulation) 封装是面向对象编程中的关键概念,它涉及如何管理和保护数据,防止外部代码直接访问或修改对象的内部状态。在JavaScript中,我们可以通过以下方式实现封装: 1. **作用域**:JavaScript...

    JAVASCRIPT设计模式[收集].pdf

    封装(Encapsulation)是面向对象编程(OOP)的一个核心原则。它通过隐藏对象的属性和行为的实现细节,只暴露必要的接口给外部使用,从而降低了模块间的耦合度。在JavaScript中,封装不是语言内置的功能,但可以通过...

    JavaScript多态与封装实例分析

    封装(Encapsulation)则是隐藏对象的内部细节,只暴露必要的接口供外部使用。在JavaScript中,由于没有内置的访问修饰符,我们通常依靠函数作用域来实现封装,比如使用立即执行的函数表达式(IIFE)来创建私有变量...

    encapsulation-axios:封装axios

    我的项目 一个Vue.js项目 构建设置 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build # build for production ...

    JavaScript中的模块化和封装

    在"Modularization-and-Encapsulation-in-JavaScript.pdf"这个文件中,可能详细探讨了JavaScript模块化和封装的原理、实践以及最佳实践。"LINQ.zip"可能是一个与.NET框架下的Language Integrated Query (LINQ)相关的...

    javascript面向对象三大特征之封装实例详解

    分享给大家供大家参考,具体如下:封装封装(Encapsulation):就是把对象内部数据和操作细节进行隐藏。很多面向对象语言都支持封装特性,提供关键字如private来隐藏某些属性和方法。要想访问被封装对象中的数据,只能...

    Javascript实现面向对象技术PPT 超牛 不看后悔

    面向对象编程的核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)和多态(Polymorphism)。在JavaScript中,由于它原生并不支持类,而是通过原型(Prototype)机制来实现面向...

    2008年图书:面向对象的JavaScript

    5. **封装(Encapsulation)**:面向对象编程的关键原则之一,JavaScript通过函数和作用域来实现封装,保护数据和实现细节。 6. **模块化(Modularization)**:JavaScript没有内置的模块系统,但可以通过立即执行...

    北大青鸟5.0 javaScript课后习题和上机答案

    7. 面向对象编程:JavaScript支持面向对象编程,包括类(class)、继承(inheritance)和封装(encapsulation)。ES6引入了类语法,但实质上仍是基于原型的继承。 8. 事件和DOM操作:JavaScript可以通过事件监听来...

    浅谈javascript面向对象编程

    本文将围绕面向对象的三个核心概念——封装(encapsulation)、继承(inheritance)和多态(polymorphism)——进行探讨,并通过具体的示例来阐述如何在JavaScript中实现这些特性。 #### 二、封装 封装是指将数据和操作...

    Javascript 面向对象程式学习笔记收藏

    面向对象编程的两个关键特性是封装(encapsulation)和继承(inheritance)。封装允许我们将数据和行为捆绑在一起,隐藏实现细节。继承则允许子类共享父类的属性和方法。在JavaScript中,可以使用`prototype`属性...

    面向对象的JavaScript基础

    4. **封装(Encapsulation)**:封装是将数据和操作数据的方法绑定在一起,对外部世界隐藏内部实现细节。在JavaScript中,通过作用域和闭包可以实现封装。例如,可以使用立即执行函数表达式(IIFE)创建私有变量和...

    编写可维护面向对象的JavaScript代码[翻译]

    面向对象编程具有几个核心概念,包括封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism): 1. 封装是指将数据(属性)和操作数据的方法(函数或方法)捆绑在一起,形成一个独立的单元——对象。...

    JavaScript实现多态和继承的封装操作示例

    本文通过实例展示了如何在JavaScript中实现这两种特性,并使用封装(Encapsulation)来提高代码的组织性和安全性。 首先,让我们理解封装的概念。封装是将数据和操作这些数据的方法绑定在一起的过程,以防止外部...

    JavaScript面向对象三个基本特征实例详解【封装、继承与多态】

    **封装(Encapsulation)** 封装是面向对象编程的核心原则之一,它旨在隐藏对象内部的实现细节,仅对外公开必要的接口供其他部分使用。在JavaScript中,我们可以通过构造函数和方法来实现封装。例如: ```...

    Javascript基于对象三大特性(封装性、继承性、多态性)

    ### 封装性(Encapsulation) 封装是指将数据(属性)和操作数据的代码(方法)结合在一起形成对象,并对外隐藏对象的实现细节,只保留有限的接口与外界进行交互。封装的目的是保护对象的内部状态,提供一种清晰的...

Global site tag (gtag.js) - Google Analytics