深入理解JavaScript函数原型

作者:小菜 更新时间:2025-03-16 点击数:
简介:相信大家都知道JavaScript面向对象的设计是基于JavaScript原型(prototype)的,也能看到很多优秀的框架(如jQuery、YUI)都应用到

【菜科解读】

相信大家都知道JavaScript面向对象的设计是基于JavaScript原型(prototype)的,也能看到很多优秀的框架(如jQuery、YUI)都应用到了prototype,那就不妨把这个可恶又奇妙的prototype给弄明白,再看那些优秀框架的源码也就不是什么难事儿了,同时,它也能够帮助我们合理组织我们的代码。

原型[prototype]:每个对像都有一个隐慝的属性用于指向到它的父对像(构造对像的函数)的原型(这里称为父原型或隐式原型),并从中继承它的属性和方法 [函数对像除了父原型引用外,还有一个显式的原型引用],在一般情况下,对像的父原型是不可以访问的,而函数对像的显式原型可以通过FunctionName.prototype进行访问 [在firefox中你可以通过对像的__proto__属性来访问对像的父原型]

这个原型属性本身又是一个Object类型的对像,因此可以给这个原型属性添加任意的属性和方法 让实例对像来继承它们

老套路,直接放置一个图——

对于这张图的说明及引深——

1.本图能够深入剖析有关原型方面的基础理论;2.本图能够解释为何使用函数原型能够节省内存,因此我们常常将可复用的成员(包括属性和方法)添加到函数原型中;3.本图中介绍的两种模式也是我们常常使用的类式继承模式(另外还包括借用构造函数、借用和设置原型、共享原型),当然每一个类式继承模式均有其应用场景,在此先不做阐述。

4.深入理解函数原型(继承)能够极大的复用我们的代码,它的实质便是实现代码复用。

深入,理解,JavaScript,函数,原型,相信,大家,都

理解DDoS攻击的攻击手段,173教你如何减轻DDoS攻击危害

大部分网络都很容易受到各种类型的黑客攻击,但是我们可以通过一套安全规范来最大限度的防止黑客攻击的发生。

但是,分布式拒绝服务攻击(DDoS) 是一个完全不同的攻击方式,你无法阻止黑客对你的网站发动DDoS攻击,除非你主动断开互联网连接。

如果我们无法防止这种攻击,那么怎么做才能最大限度地保护企业网络呢?首先你应该清楚的了解DDoS攻击的三个阶段,然后再学习如何将这种攻击的危害降到最低。

理解DDoS攻击一个DDoS攻击一般分为三个阶段。

第一阶段是目标确认:黑客会在互联网上锁定一个企业网络的IP地址。

这个被锁定的IP地址可能代表了企业的web服务器,DNS服务器,互联网网关等。

而选择这些目标进行攻击的目的同样多种多样,比如为了赚钱(有人会付费给黑客攻击某些站点),或者只是以破坏为乐。

第二个阶段是准备阶段:在这个阶段,黑客会入侵互联网上大量的没有良好防护系统的计算机(基本上就是网络上的家庭计算机,ADSL宽带或有线电缆上网方式为主)。

黑客会在这些计算机中植入日后攻击目标所需的工具。

第三个阶段是实际攻击阶段:黑客会将攻击命令发送到所有被入侵的计算机(也就是僵尸计算机)上,并命令这些计算机利用预先植入的攻击工具不断向攻击目标发送数据包,使得目标无法处理大量的数据或者频宽被占满。

聪明的黑客还会让这些僵尸计算机伪造发送攻击数据包的IP地址,并且将攻击目标的IP地址插在数据包的原始地址处,这就是所谓的反射攻击。

服务器或路由器看到这些资料包后会转发(即反射)给原始IP地址一个接收响应,更加重了目标主机所承受的数据流。

因此,我们无法阻止这种DDoS攻击,但是知道了这种攻击的原理,我们就可以尽量减小这种攻击所带来的影响。

减少攻击影响入侵过滤(Ingressfiltering)是一种简单而且所有网络(ISP)都应该实施的安全策略。

在你的网络边缘(比如每一个与外网直接相连的路由器),应该建立一个路由声明,将所有数据来来源IP标记为本网地址的数据包丢弃。

虽然这种方式并不能防止DDoS攻击,但是却可以预防DDoS反射攻击。

减轻DDoS攻击危害但是很多大型ISP好像都因为各种原因拒绝实现入侵过滤,因此我们需要其它方式来降低DDoS带来的影响。

目前最有效的一个方法就是反追踪(backscattertracebackmethod)。

要采用这种方式,首先应该确定目前所遭受的是外部DDoS攻击,而不是来自内网或者路由问题。

接下来就要尽快在全部边缘路由器的外部接口上进行配置,拒绝所有流向DDoS攻击目标的数据流。

另外,还要在这些边缘路由器端口上进行配置,将全部无效或无法定位的数据来源IP的数据包丢弃。

比如以下地址:10.0.0.0-10.255.255.255172.16.0.0-172.31.255.255192.168.0.0-192.168.255.255将路由器设置为拒绝这些资料包后,路由器会在每次拒绝数据包时发送一个因特网控制讯息协议(ICMP)包,并将 destinationunreachable 信息和被拒绝的数据包打包发送给来源IP地址。

接下来,打开路由器日志,查看那个路由器收到的攻击资料包最多。

然后根据所记录的数据包来源IP确定哪个网段的资料量最大。

在这个路由器上调整路由器针对这个网段为 黑洞 状态,并藉由修改子网掩码的方法将这个网段隔离开。

然后再寻找这个网段的所有者的信息,联系你的ISP以及数据发送网段的ISP,将攻击情况汇报给他们,并请求协助。

不论他们是否愿意帮忙,无非是一个电话的问题。

接下来为了让服务和合法流量通过,你可以将其它一些攻击情况较轻的路由器恢复正常,只保留承受攻击最重的那个路由器,并拒绝攻击来源最大的网段。

如果你的ISP和对方ISP很负责的协助阻挡攻击数据包,你的网络将很快恢复正常。

结束语DDoS攻击很狡猾,也很难预防,但是你可以借由以上方式及时减轻这种攻击对网络的影响。

面对攻击,你只需要快速地响应和正确的方法,就可以及时发现攻击数据流并将其挡掉。

理解,DDoS,攻击,的,手段,173,教你,如何,减轻,

javascript中字符串常用操作总结、JS字符串操作大全

字符串的操作在js中非常频繁,也非常重要。

以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊。

今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温习查阅。

String对象属性(1) length属性length算是字符串中非常常用的一个属性了,它的功能是获取字符串的长度。

当然需要注意的是js中的中文每个汉字也只代表一个字符,这里可能跟其他语言有些不一样。

var str = ‘abc‘;console.log(str.length);(2) prototype属性prototype在面向对象编程中会经常用到,用来给对象添加属性或方法,并且添加的方法或属性在所有的实例上共享。

因此也常用来扩展js内置对象,如下面的代码给字符串添加了一个去除两边空格的方法:String.prototype.trim = function(){ return this.replace(/^\s*|\s*$/g, ‘‘);}String对象方法1.获取类方法(1) charAt()stringObject.charAt(index)charAt()方法可用来获取指定位置的字符串,index为字符串索引值,从0开始到string.leng – 1,若不在这个范围将返回一个空字符串。

如:var str = ‘abcde‘;console.log(str.charAt(2)); //返回cconsole.log(str.charAt(8)); //返回空字符串(2) charCodeAt()stringObject.charCodeAt(index)charCodeAt()方法可返回指定位置的字符的Unicode编码。

charCodeAt()方法与charAt()方法类似,都需要传入一个索引值作为参数,区别是前者返回指定位置的字符的编码,而后者返回的是字符子串。

var str = ‘abcde‘;console.log(str.charCodeAt(0)); //返回97(3) fromCharCode()String.fromCharCode(numX,numX,…,numX)fromCharCode()可接受一个或多个Unicode值,然后返回一个字符串。

另外该方法是String 的静态方法,字符串中的每个字符都由单独的数字Unicode编码指定。

String.fromCharCode(97, 98, 99, 100, 101) //返回abcde2.查找类方法(1) indexOf()stringObject.indexOf(searchvalue,fromindex)indexOf()用来检索指定的字符串值在字符串中首次出现的位置。

它可以接收两个参数,searchvalue表示要查找的子字符串,fromindex表示查找的开始位置,省略的话则从开始位置进行检索。

var str = ‘abcdeabcde‘;console.log(str.indexOf(‘a‘)); // 返回0console.log(str.indexOf(‘a‘, 3)); // 返回5console.log(str.indexOf(‘bc‘)); // 返回1(2) lastIndexOf()方法stringObject.lastIndexOf(searchvalue,fromindex)lastIndexOf()语法与indexOf()类似,它返回的是一个指定的子字符串值最后出现的位置,其检索顺序是从后向前。

var str = ‘abcdeabcde‘;console.log(str.lastIndexOf(‘a‘)); // 返回5console.log(str.lastIndexOf(‘a‘, 3)); // 返回0 从第索引3的位置往前检索console.log(str.lastIndexOf(‘bc‘)); // 返回6(3) search()方法stringObject.search(substr) stringObject.search(regexp)search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。

它会返回第一个匹配的子字符串的起始位置,如果没有匹配的,则返回-1。

var str = ‘abcDEF‘;console.log(str.search(‘c‘)); //返回2console.log(str.search(‘d‘)); //返回-1console.log(str.search(/d/i)); //返回3(4) match()方法stringObject.match(substr) stringObject.match(regexp)match()方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

如果参数中传入的是子字符串或是没有进行全局匹配的正则表达式,那么match()方法会从开始位置执行一次匹配,如果没有匹配到结果,则返回null。

否则则会返回一个数组,该数组的第0个元素存放的是匹配文本,除此之外,返回的数组还含有两个对象属性index和input,分别表示匹配文本的起始字符索引和stringObject 的引用(即原字符串)。

var str = ‘1a2b3c4d5e‘;console.log(str.match(‘h‘)); //返回nullconsole.log(str.match(‘b‘)); //返回["b", index: 3, input: "1a2b3c4d5e"]console.log(str.match(/b/)); //返回["b", index: 3, input: "1a2b3c4d5e"]如果参数传入的是具有全局匹配的正则表达式,那么match()从开始位置进行多次匹配,直到最后。

如果没有匹配到结果,则返回null。

否则则会返回一个数组,数组中存放所有符合要求的子字符串,并且没有index和input属性。

var str = ‘1a2b3c4d5e‘;console.log(str.match(/h/g)); //返回nullconsole.log(str.match(/\d/g)); //返回["1", "2", "3", "4", "5"]3.截取类方法(1) substring()stringObject.substring(start,end)substring()是最常用到的字符串截取方法,它可以接收两个参数(参数不能为负值),分别是要截取的开始位置和结束位置,它将返回一个新的字符串,其内容是从start处到end-1处的所有字符。

若结束参数(end)省略,则表示从start位置一直截取到最后。

var str = ‘abcdefg‘;console.log(str.substring(1, 4)); //返回bcdconsole.log(str.substring(1)); //返回bcdefgconsole.log(str.substring(-1)); //返回abcdefg,传入负值时会视为0(2) slice()stringObject.slice(start,end)slice()方法与substring()方法非常类似,它传入的两个参数也分别对应着开始位置和结束位置。

而区别在于,slice()中的参数可以为负值,如果参数是负数,则该参数规定的是从字符串的尾部开始算起的位置。

也就是说,-1 指字符串的最后一个字符。

var str = ‘abcdefg‘;console.log(str.slice(1, 4)); //返回bcdconsole.log(str.slice(-3, -1)); //返回efconsole.log(str.slice(1, -1)); //返回bcdefconsole.log(str.slice(-1, -3)); //返回空字符串,若传入的参数有问题,则返回空(3) substr()stringObject.substr(start,length)substr()方法可在字符串中抽取从start下标开始的指定数目的字符。

其返回值为一个字符串,包含从 stringObject的start(包括start所指的字符)处开始的length个字符。

如果没有指定 length,那么返回的字符串包含从start到stringObject的结尾的字符。

另外如果start为负数,则表示从字符串尾部开始算起。

var str = ‘abcdefg‘;console.log(str.substr(1, 3)) //返回bcdconsole.log(str.substr(2)) //返回cdefgconsole.log(str.substr(-2, 4)) //返回fg,目标长度较大的话,以实际截取的长度为准4.其他方法(1) replace()方法stringObject.replace(regexp/substr,replacement)replace()方法用来进行字符串替换操作,它可以接收两个参数,前者为被替换的子字符串(可以是正则),后者为用来替换的文本。

如果第一个参数传入的是子字符串或是没有进行全局匹配的正则表达式,那么replace()方法将只进行一次替换(即替换最前面的),返回经过一次替换后的结果字符串。

var str = ‘abcdeabcde‘;console.log(str.replace(‘a‘, ‘A‘));console.log(str.replace(/a/, ‘A‘));如果第一个参数传入的全局匹配的正则表达式,那么replace()将会对符合条件的子字符串进行多次替换,最后返回经过多次替换的结果字符串。

var str = ‘abcdeabcdeABCDE‘;console.log(str.replace(/a/g, ‘A‘)); //返回AbcdeAbcdeABCDEconsole.log(str.replace(/a/gi, ‘$‘)); //返回$bcde$bcde$BCDE(2) split()方法stringObject.split(separator,howmany)split()方法用于把一个字符串分割成字符串数组。

第一个参数separator表示分割位置(参考符),第二个参数howmany表示返回数组的允许最大长度(一般情况下不设置)。

var str = ‘a|b|c|d|e‘;console.log(str.split(‘|‘)); //返回["a", "b", "c", "d", "e"]console.log(str.split(‘|‘, 3)); //返回["a", "b", "c"]console.log(str.split(‘‘)); //返回["a", "|", "b", "|", "c", "|", "d", "|", "e"]也可以用正则来进行分割var str = ‘a1b2c3d4e‘;console.log(str.split(/\d/)); //返回["a", "b", "c", "d", "e"](3) toLowerCase()和toUpperCase()stringObject.toLowerCase() stringObject.toUpperCase()toLowerCase()方法可以把字符串中的大写字母转换为小写,toUpperCase()方法可以把字符串中的小写字母转换为大写。

var str = ‘JavaScript‘;console.log(str.toLowerCase()); //返回javascriptconsole.log(str.toUpperCase()); //返回JAVASCRIPT javascript,中,字符串,常用,操作,总结,、,大全

加入收藏
               

深入理解JavaScript函数原型

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录