<!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>
相关推荐
### 封装(Encapsulation) 封装是面向对象编程中的关键概念,它涉及如何管理和保护数据,防止外部代码直接访问或修改对象的内部状态。在JavaScript中,我们可以通过以下方式实现封装: 1. **作用域**:JavaScript...
封装(Encapsulation)是面向对象编程(OOP)的一个核心原则。它通过隐藏对象的属性和行为的实现细节,只暴露必要的接口给外部使用,从而降低了模块间的耦合度。在JavaScript中,封装不是语言内置的功能,但可以通过...
封装(Encapsulation)则是隐藏对象的内部细节,只暴露必要的接口供外部使用。在JavaScript中,由于没有内置的访问修饰符,我们通常依靠函数作用域来实现封装,比如使用立即执行的函数表达式(IIFE)来创建私有变量...
我的项目 一个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 ...
在"Modularization-and-Encapsulation-in-JavaScript.pdf"这个文件中,可能详细探讨了JavaScript模块化和封装的原理、实践以及最佳实践。"LINQ.zip"可能是一个与.NET框架下的Language Integrated Query (LINQ)相关的...
分享给大家供大家参考,具体如下:封装封装(Encapsulation):就是把对象内部数据和操作细节进行隐藏。很多面向对象语言都支持封装特性,提供关键字如private来隐藏某些属性和方法。要想访问被封装对象中的数据,只能...
面向对象编程的核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)和多态(Polymorphism)。在JavaScript中,由于它原生并不支持类,而是通过原型(Prototype)机制来实现面向...
5. **封装(Encapsulation)**:面向对象编程的关键原则之一,JavaScript通过函数和作用域来实现封装,保护数据和实现细节。 6. **模块化(Modularization)**:JavaScript没有内置的模块系统,但可以通过立即执行...
7. 面向对象编程:JavaScript支持面向对象编程,包括类(class)、继承(inheritance)和封装(encapsulation)。ES6引入了类语法,但实质上仍是基于原型的继承。 8. 事件和DOM操作:JavaScript可以通过事件监听来...
本文将围绕面向对象的三个核心概念——封装(encapsulation)、继承(inheritance)和多态(polymorphism)——进行探讨,并通过具体的示例来阐述如何在JavaScript中实现这些特性。 #### 二、封装 封装是指将数据和操作...
面向对象编程的两个关键特性是封装(encapsulation)和继承(inheritance)。封装允许我们将数据和行为捆绑在一起,隐藏实现细节。继承则允许子类共享父类的属性和方法。在JavaScript中,可以使用`prototype`属性...
4. **封装(Encapsulation)**:封装是将数据和操作数据的方法绑定在一起,对外部世界隐藏内部实现细节。在JavaScript中,通过作用域和闭包可以实现封装。例如,可以使用立即执行函数表达式(IIFE)创建私有变量和...
面向对象编程具有几个核心概念,包括封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism): 1. 封装是指将数据(属性)和操作数据的方法(函数或方法)捆绑在一起,形成一个独立的单元——对象。...
本文通过实例展示了如何在JavaScript中实现这两种特性,并使用封装(Encapsulation)来提高代码的组织性和安全性。 首先,让我们理解封装的概念。封装是将数据和操作这些数据的方法绑定在一起的过程,以防止外部...
**封装(Encapsulation)** 封装是面向对象编程的核心原则之一,它旨在隐藏对象内部的实现细节,仅对外公开必要的接口供其他部分使用。在JavaScript中,我们可以通过构造函数和方法来实现封装。例如: ```...
### 封装性(Encapsulation) 封装是指将数据(属性)和操作数据的代码(方法)结合在一起形成对象,并对外隐藏对象的实现细节,只保留有限的接口与外界进行交互。封装的目的是保护对象的内部状态,提供一种清晰的...