前言:
当前同学们对“js坑”大体比较珍视,朋友们都想要分析一些“js坑”的相关内容。那么小编在网上收集了一些有关“js坑””的相关文章,希望兄弟们能喜欢,姐妹们一起来学习一下吧!本文实例讲述了jsprototype深入理解及应用。分享给大家供大家参考,具体如下:
上一篇讲了js的prototype概念,在这里回顾一下prototype的定义:
prototype是函数的一个属性,并且是函数的原型对象。引用它的必然是函数,这个应该记住。
但是,很奇怪,各位看官,你有没有看过类似下面这样引用prototype的js代码:
咦???看着上面这行代码,你是不是对prototype只是属于函数产生深深的怀疑呢?
你明白上面那个函数的意思吗?我还是解释一下吧。
call是函数的一个方法,关于这个方法,它也是只有····函数····才能够调用的,它的作用是:调用引用它的函数。
就拿这个Array.prototype.slice.call(arguments,1)来讲,这里面包含太多信息了,我一个个分析一下。
slice(start[,end])是js的一个原生数组函数,作用是获取数组中从start下标开始到end下标结束的元素。举个例子:
arguments是js函数对象的一个属性,作用是获取函数的实参,返回的是一个以函数实参为属性元素的对象。举个例子:
关于函数的对象属性arguments这里就讲这么多了,要详细理解,可以百度。
而Array是js中生成数组的关键字。
这里为什么要用Array.prototype来调用slice函数呢?而不用Array.slice,原因很简单,因为数组的关键字Array不能这样子Array.xx直接调用js的数组函数。但为什么不能直接这样调用呢?不急,下面我们来做实验,你就会很清楚了。
这里直接给你报错了,说明了什么?呵呵,这说明Array关键字确实不能直接调用数组的函数。
这里返回都是空数组···[]···,说明了什么?说明了Array关键字确实是可以调用prototype函数的属性的,同时也说明js是可以这样子Array.prototype调用js的数组函数的。
说到这里,问题就来了,我上面不是说,prototype是js函数的一个属性,只能被函数调用吗?怎么这里Array关键字可以调用这个属性prototype呢?那么,我这不是坑自己对prototype的定义是错误的吗?我这不是给自己打脸吗?哎,看官,没错,你这里看到的都是正确的。可是,至于Array关键字可以调用函数的prototype属性,我有没有给自己打脸,这里,我们先别急得下结论。
转个弯说,看官是否还记得js生成数组的几种方式?应该有多种,但,我这里就不介绍了。
不过,你是否看过这样生成数组的方式?我们先来看下面的代码:
这个方式生成数组还记得吧?那么,我们js的function是不是也可以像下面这样子生成对象呢?
上面生成数组的方式和下面构造函数生成对象的方式是不是很相似?没错,js中function和Array都是可以通过new来生成对象这样的东西,这说明了什么呢?你看Array()和func()是不是很像?是不是最后面都有一对圆括号?是就对了,呵呵,说了这么多,我只是想揭露一样东西,这个东西就是,假如我猜的的没有错的话,Array()这个东西其实是js一个·····构造数组的内置函数····,不然,可以用newArray()的方式生存数组的方式就说不过去了是吧?
讲到这里,我们再返回来说js可以这样子Array.prototype调用prototype就很明白不过了是吧?Array()是js的一个内置函数,既然Array是一个函数,那么Array肯定拥有prototype这个属性对吧?所以说,Array关键字调用prototype并没有违反prototype是函数的一个属性这个原则,prototype是函数的一个属性依然是一个不变的结论。
关于Array生成数组的方式,类似的我们是否可以这样子newObject()生成对象,或者newString()这样子生成字符串?既然可以这样子构造对象和字符串,那么我们下面的代码也应该是可行的,对吧?
根据上面的解释,你应该知道这里是可以执行的吧?你应该知道这里的之所以能执行的原理吧?你自己试试。这里就不再解释了。
讲到这里,哎,我既然把行文开始的那个函数给忘了?这里讲解一下本文开始那个func函数的作用:
func函数的作用就是,从第二个实参数开始获取func函数的实参。
我来给你分析一下:
Array.prototype是一个空数组,
Array.prototype.slice()的意思是一个空数组调用数组的函数slice(),
Array.prototype.slice.call()的意思是call函数调用数组的函数slice(),
这里call()怎么调用slice()呢?
是这样子的,Arguments获取func函数实参列表,生成一个对象传递给call()函数,call函数又把Arguments生成的对象传递给Array.prototype这个空数组,把第二个参数···1···传递给slice函数,然后,call就让引用它的函数slice执行slice(1),所以slice就从1下标开始获取数组的元素了,而这个数组的元素其实就是Arguments的元素,因此,这个函数func的作用就是获取下标为1开始的所有实参。不相信,你自己可以执行一下上面的函数。
下面讲讲prototype的应用:
应用1:
给原型对象增加函数,就是让对象拥有公用的函数。
例子:我给数组原型对象增加一个打乱数组方法:
你可以尝试着再增加一个数组arr3看看它能不能调用shuffle函数,因为我这里是给Array的原型对象增加的函数,所以在这个脚本内,所有数组都拥有shuffle这个函数。
应用2:
给原型对象增加属性,也就是给对象增加公用的属性
例子:
应用3:
实现原型继承;
关于prototype就讲到这里,假如本文有什么错误,还望各位看官指出,我好纠正。
特别指出:
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
标签: #js坑