热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Javascript设想形式读书笔记(二)——封装,简朴的建立对象形式

什么是封装找事情时一些公司给了offer后我就想晓得真正拿到手的是多少,毕竟钱粮沉重。但种种税也好,五险一金也好我实在是弄不清楚,因而我就会在网上的一些税后收入盘算器上举行盘算,只

什么是封装

找事情时一些公司给了offer后我就想晓得真正拿到手的是多少,毕竟钱粮沉重。但种种税也好,五险一金也好我实在是弄不清楚,因而我就会在网上的一些税后收入盘算器上举行盘算,只须要填写一些基础信息,比方税前收入,地点区域等等,就能够取得细致的效果,包含种种税收的细致数值。在这个历程当中,我只是根据接口给定的请求举行了数据的输入,详细盘算历程我并不晓得。也就是说,在这个顺序内部,数据表现形式和完成细节是隐蔽的,这在某种意义上也是封装的一种。

在Javascript中,对象中的细节偶然也须要隐蔽,但JS不像其他的静态言语,比方Java,一样,有private如许的关键字。那末在Javascript中,就能够用闭包的观点来建立只能从对象内部接见的要领和属性。

在运用接口完成信息隐蔽的历程当中,同时也是运用了接口的观点。比如火影里的通灵术,人与动物签订契约,举行某种交流。这中心的沟通渠道稳定,签订契约的人就能够随时随地举行通灵。一个类中,应当定义充足的平安的接口。但是在JS中,言语特征非常天真,类中的公有要领和私有要领现实是一样的。因而,在完成类的时刻,应当防备公然未定义于接口的要领。

建立对象

Javascript中,建立对象的基础形式有三种。
1. 直接建立 对象中的一切要领都是公有的,能够公然接见。
2. 运用下划线 在私有要领称号前加下划线,示意该要领私有。
3. 运用闭包 闭包能够建立真正意义上的私有成员,这些成员只能经由过程特定要领接见。

直接建立

所谓直接建立,就是根据传统的体式格局建立一个类,组织器是一个函数,属性和要领悉数公然,比方:

var Fruit = function(color, weight) {
this.color = color || 'orange';
this.weight = weight || 150;
}
Fruit.prototype.boom = function() {
...
}

这类要领一般来说没什么题目,然则当其原型上的要领boom对本身的属性color或许weight有肯定依靠,而组织时传入的参数不符合肯定请求时就会失足。但假如组织时没有失足则一切要领应当能一般事情才是。

固然这个题目能够在组织对象时就对传入的参数举行考证,也不算太严峻。但是另一个题目在于,纵然能对参数举行考证,任何顺序员照样能够随便修正属性的值。为了处理这个题目,能够设想一个数据的取值器和赋值器。

var Fruit = function(color, weight) {
this.setColor(color);
this.setWeight(weight);
}
Fruit.prototype = {
checkColor: function(color) {
...
},
setColor: function(color) {
...
this.color = color;
},
getColor: function() {
return this.color;
},
...
}

当顺序员之间商定以供应的要领对属性值举行操纵时,操纵历程能够相对获得范例。但现实上属性依然是公然的,能够被直接设置,这类要领并不能阻挠这类行动。

运用下划线,区分私用成员

此种要领与前一种要领现实上是一回事,只是在私用的要领和属性前加了下划线示意它是私用的。

var Fruit = function(color, weight) {
this.setColor(color);
this.setWeight(weight);
}
Fruit.prototype = {
_checkColor: function(color) {
...
},
setColor: function(color) {
... // 此处对输入的数据举行考证,不能经由过程考证就抛出非常
this._color = color;
},
getColor: function() {
return this._color;
},
...
}

这类要领有助于防备对私用要领的无意运用,但没法保证顺序员不故意运用它们。

运用闭包

借助闭包就能够建立只允许特定函数接见的变量了,私用属性的建立要领等于在组织函数的作用域中建立变量即可,这些变量能够被该作用域中的一切函数接见。

var Fruit = function(newColor, weight) {
var color, weight;
// 私用要领
function _checkColor = function(color) {
...
}
// 特权要领
this.getColor = function() {
return color;
};
this.setColor = function(newColor) {
... // 考证输入
color = newColor;
}
// 组织历程代码
this.setColor(newColor);
}

借助this关键字建立的要领就是特权要领了,它们是公然要领,同时也能够接见私有变量。假如须要建立一些不须要接见私有属性的要领的话,能够在Fruit.prototype上举行建立。经由过程这类体式格局建立的要领,不能直接接见私有变量,然则能够经由过程getColor如许的特权要领举行间接接见。

固然这类体式格局也有弊病,假如特权要领过量,会占用较多内存,因为经由过程组织函数建立的实例都保留了特权要领的副本,而原型上的要领只要一份。因而,在设想组织函数时,须要举行慎重考虑。

另一个题目就在于如许的要领没法作用于须要建立子类的场景,因为特权要领都是新的副本,所以子类没法接见超类的任何私用属性或要领。因而在Javascript中,这类题目被称作“继续损坏封装”(inheritance breaks encapsulation)。

高等建立对象形式初探

以上的三种要领属于制造对象的基础要领,但要完成一些高等的建立对象形式,有必要先相识一些观点。

静态要领和属性

前述的闭包建立对象法能够建立私用属性和要领,然则如许的话,这些属性在建立子类时会同时建立副本存于子类,形成内存的糟蹋。关于一些只须要在类层面举行操纵和接见的属性,能够应用闭包建立静态成员。静态成员每一个只要一份,直接经由过程类对象举行接见。

依然以之前的Orange类为例,运用闭包特征增加一些静态成员:

var Orange = (function() {
// 私用静态属性
var numOfOranges = 0;
// 私用静态要领
function checkColor() {
...
}
// 返回组织器
return function(newColor, weight) {
var color, weight;
// 特权要领
this.getColor = function() {
return color;
};
this.setColor = function(newColor) {
...
color = newColor;
}
// 组织器代码
numOfOrange++;
if (numOfOrange > 100) {
throw new Error('Only 100 instances of Orange can be created.');
}
this.setColor(newColor);
}
})();
// 公然静态要领
Orange.turnToJuice = function() { // 不增加在Orange的prototype上
...
};
// 公然的非特权要领
Orange.prototype = {
checkWeight: function() {
...
}
};

这与之前的闭包建立类的最大区分在于组织器由一个一般函数变成了一个内嵌函数,经由过程一个自实行函数的返回值赋给Orange。在实例化Orange时,挪用的是返回的内嵌函数,外层函数只是一个用来寄存静态私用成员的闭包。在组织器中的特权要领能够接见组织器以外的静态属性和要领,而静态要领不能接见任何定义在组织器中的私用属性。

常量

常量就是不能被修正的变量,应用静态属性能够在Javascript中模仿常量。对常量只建立作为取值器的静态要领,而不建立赋值器,在外围作用域中也不能接见到常量:

var Class = (function() {
// 常量
var COnST= 100;
// 组织器
var cOnstructorFunc= function(param) {
...
};
// 静态要领,取值器
cOnstructorFunc= function() {
return CONST;
};
return constructorFunc;
})();

封装之利害

封装之利

庇护内部数据,只对外供应取值器和赋值器,便于重构。削减模块间耦合。

封装之弊

难以举行单元测试,外部测试没法接见到内部变量和要领。不过如公用要领能够间接接见私用要领的话,能够对私用要领举行间接单元测试。

完成历程较为庞杂,调试难度比较大。


推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有