Javascript面向对象特性实现封装、继承、接口详细案例
Javascript面向对象特性实现(封装、继承、接口)
Javascript作为弱类型语言,和Java、php等服务端脚本语言相比,拥有极强的灵活性。对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效;但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends、implement)。为了实现这些面向对象的特性,需要额外编写一些代码,如下。
在开始使用OO特性之前,还需要考虑使用接口、继承所带来的弊端。封装、接口、继承都将使代码结构变得复杂,对于编码新手有较高的要求,对于别人接受你的项目成本也提高了,在团队协作中需要根据具体需求斟酌,不要为了秀技术而写代码;同时,封装和接口都将带来一些额外的内存开销,有些可以忽略不计,有些 则是得不偿失,需要注意。
一、封装
- var book = (function(){
- var COUNT = 0;
- //静态私有方法
- function checkISBN(isbn){
- return true;
- }
- //构造器
- var ctor = function(id,name,isbn){
- var _id,_name,_isbn
- this.setId= function(id){
- _id=id;
- }
- this.getId = function(){
- return _id;
- }
- this.setName = function(name){
- _name = name;
- }
- this.getName = function(){
- return name;
- }
- this.setIsbn = function(isbn){
- _isbn = isbn;
- }
- this.getIsbn = function(){
- return isbn;
- }
- if(checkISBN){
- COUNT++;
- }
- this.setName(name);
- this.setId(id);
- this.setIsbn(isbn);
- }
- ctor.getCount = function(){
- return COUNT;
- }
- return ctor;
- })();
- //静态、共用方法
- book.buyCount = function(count){
- return count;
- }
- book.prototype = {
- display:function(){
- }
- }
- var b = new book();
- b.getCount();
- b.display();
二、接口
- /**
- * 接口:实现多个类的共同性。让彼此不想关的对象也能被同等对待。
- */
- var Interface = function(name,method){
- if(arguments.length < 2){
- throw new Error("xxx");
- }
- this.name = name;
- this.method = [];
- for(var i = 0;i<method.length;i++){
- if(typeof method[i] !== 'string'){
- throw new Error("xxx");
- }
- this.method.push(method[i]);
- }
- }
- //public static method
- Interface.ensureImplement = function(object){
- for(var i = 0;i<arguments.length;i++){
- var interface = arguments[i];
- if(Interface.construction !== Interface){
- throw new Error("xxx");
- }
- for(var j = 0;j<ingerface.method.length;j++){
- var method = interface.method[j];
- if(!object[method] || typeof object[method] !==='function'){
- throw new Error("xxx");
- }
- }
- }
- }
- var testResultInstance = new Interface("testResultInstance",["getData","getResults"]);
- function testInterface = function(mapInstance){
- Interface.ensureImplement(mapInstance,testResultInstance);
- mapInstance.getData();
- mapInstance.getResults();
- }
- function Map(name){
- this.name = name;
- this.getData = function(){};
- this.getResults = function(){};
- }
- var mapInstance = new Map("test");
- testInterface(mapInstance);
三、继承
- /**
- * 继承提供一些代码复用的功能。但继承照成两个类间的强耦合
- */
- //类式继承
- function Person(name){
- this.name = name;
- }
- function Design(name,book){
- Person.call(this,name);
- this.book = book;
- }
- extend(Person,Desion);
- Design.prototype.getBooks = function(){
- return this.book;
- }
- var d = new Design("tim","test");
- d.getBooks();
- d.name;
- function extend(superclass,subclass){
- var F = function(){};
- F.prototype = superclass.prototype;
- subclass.prototype = new F();
- subclass.prototype.constructor = subclass
- subclass.superclass = superclass;
- if(superclass.prototype.constructor == Object.prototype.constructor){
- superclass.prototype.constructor = superclass;
- }
- }
- /********************************************************************/
- //原型继承
- function clone(superclass){
- var F = function(){};
- F.prototype = superclass;
- return new F();
- }
- var Person = {
- name:"default",
- getName : function(){
- return this.name;
- }
- };
- var Desion = clone(Person);
- Desion.books = ["写给大家看的设计书"];
- Desion.getBooks = function(){
- return this.books;
- }
- /********************************************************************/
- //参元法
- var Mimin = function(){};
- Mimin.prototype = {
- name : 'default',
- getName : function(){
- return this.name;
- }
- };
- function augment(receiveingClass,givingClass){
- for(methodName in givingClass){
- if(!receiveingClass[methodName]){
- receiveingClass[methodName] = methodName;
- }
- }
- }
Javascript面向对象实现分页
- <script type="text/javascript">
- function Map() {
- this.keys = new Array();
- this.data = new Array();
- //添加键值对
- this.set = function (key, value) {
- if (this.data[key] == null) {//如键不存在则身【键】数组添加键名
- this.keys.push(key);
- }
- this.data[key] = value; //给键赋值
- };
- //获取键对应的值
- this.get = function (key) {
- return this.data[key];
- };
- //去除键值,(去除键数据中的键名及对应的值)
- this.remove = function (key) {
- this.keys.remove(key);
- this.data[key] = null;
- };
- //判断键值元素是否为空
- this.isEmpty = function () {
- return this.keys.length == 0;
- };
- //获取键值元素大小
- this.size = function () {
- return this.keys.length;
- };
- }
- function dataGrid(obj) {
- if (obj == null) {
- return alert("请填入参数");
- }
- this.dataArray = new Map();
- this.index = 0;
- this.data = obj.data != null ? obj.data : "";
- this.maxPage = 0;
- this.pageNumber = 1;
- this.pageSize = obj.pageSize != null ? obj.pageSize : 10;
- this.pageToal = 0;
- this.dataGrid = new Array();
- }
- dataGrid.prototype.getDataGrid = function (index) {
- this.dataGrid.splice(0, dataGrid.length);
- var page = index * this.pageSize + this.pageSize;
- if (this.pageToal - page > this.pageSize) {
- page = page;
- } else if (this.pageToal - page < this.pageSize && this.pageToal - page > 0) {
- page = index * this.pageSize + (this.pageToal - page);
- } else {
- page = index * this.pageSize + this.pageToal;
- }
- for (var i = index * this.pageSize; i < page; i++) {
- this.dataGrid[this.dataArray.keys[i]] = this.dataArray.data[this.dataArray.keys[i]];
- }
- }
- dataGrid.prototype.packageing = function (obj) {
- var data = obj ? obj : this.data;
- for (var items in data) {
- this.dataArray.set(items, data[items]);
- this.pageToal++;
- }
- this.maxPage = Math.ceil(this.pageToal / this.pageSize);
- this.getDataGrid(this.index);
- }
- dataGrid.prototype.load = function () {
- this.packageing();
- return this.dataGrid;
- }
- dataGrid.prototype.goit = function (index) {
- if (index * this.pageSize > this.pageToal) {
- return;
- } else {
- this.getDataGrid(index - 1);
- }
- return this.dataGrid;
- }
- </script>
Javascript面向对象特性实现封装、继承、接口详细案例的更多相关文章
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- .NET面向对象特性之封装
.NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...
- (一)Javascript 面向对象编程:封装
Javascript 面向对象编程:封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP ...
- PHP面向对象 实例化 构造函数 封装 继承 静态
PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...
- Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
- Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态
一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态
一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- javascript面向对象(一):封装
本文来自阮一峰 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学 ...
随机推荐
- 低电平ViL
低电平 编辑 低电平(Vil)指的是保证逻辑门的输入为低电平时所允许的最大输入低电平,当输入电平低于Vil时,则认为输入电平为低电平. 中文名 低电平 外文名 Vil 主要应用 测量电缆和保护连接 ...
- nginx thinkphp只能访问首页
代码部署到了服务器上,发现无论怎样请求,都是跳转到index/index/index(模块/控制器/方法),最后需要nginx重新地址即可 参考:Linux下Nginx部署Thinkphp5访问任何地 ...
- 如何优雅的解决mac安装zsh不执行.bash_profile
最近刚刚重装了系统,并安装了优雅的shell命令工具zsh,突然发现我放在我的工作目录下的.bash_profile居然在启动的时候执行,导致我的java的一些配置没有注册到bash中.然后查资料得知 ...
- (一)flask-sqlalchemy的安装和配置
在使用flask-sqlalchemy之前要先了解ORM模型,什么叫做ORM模型 一.什么是ORM ORM 全拼Object-Relation Mapping. 称为对象-关系映射 主要实现模型对象到 ...
- 解题:HAOI2018 苹果树
题面 统计贡献,每个大小为i的子树贡献就是$i(n-i)$,然后子树里又有$i!$种:同时这个子树的根不确定,再枚举这个根是$r$个放的,又有了$r!$种.子树内选点的方式因为子树的根被钦定了顺序所以 ...
- NLog类库使用探索——编程配置
以编程的方式配置,这是我项目中的,我都不知道为什么使用编程.直接配置不很好吗,估计他也没有研究.直接上步骤和代码: 创建一个LoggingConfiguration对象,用来保存配置信息 至少创建一个 ...
- Flask filter过滤器
简单的数据集体添加样式输出用管道过滤,除了flask模块以外不需要导其他的包 <head> <meta charset="UTF-8"> <meta ...
- 2018.11.26 QLU新生赛部分题解
问题 L: 寄蒜几盒? 题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Ye ...
- 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能
在监控摄像机安装后,往往需要设置IP等信息,在IP不知道的情况下,IP搜索是一个很常见也必须的功能. 考虑到设备IP和当前局域网可能不在同一个网段,ARP是一个不错的选择. 首先安装WinPcap软件 ...
- Java项目中,如何限制每个用户访问接口的次数
转自:https://blog.csdn.net/qq_30947533/article/details/78844709 方法1:数据访问量大的话 用redis来做,用户在调用短信接口时,先根据用户 ...