关于prototype.js的一些技术说明

2016-02-19 16:34 7 1 收藏

下面是个简单易学的关于prototype.js的一些技术说明教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!

【 tulaoshi.com - Web开发 】

  本文是转载,关于prototype.js的一些技术说明说明,比如关于javascript的apply和call函数,关于闭包,关于函数的绑定,关于事件的注册,关于事件监听最佳实践等等,很难得的一篇文章,从dnew.cn转载而来。

  关于闭包

  prototype.js在Class.create,bind等中用到javascript的闭包特色。但整体上prototype.js对于强大的闭包特性用的不多。大家可以参阅我翻译的篇文章了解闭包。

  3、让我比较反感的两个方法

  (1)

var Class = { create: function() {  return function() {   this.initialize.apply(this, arguments);  } }}

  很讨厌用别的语言的风格来写javascript。用这个方法构造自定义类 并没有觉得有多方便,减少代码行数,只会让人难理解,多定义一个initialize方法。

  其实讨厌这条有些牵强,不过修改Object的原型对象就有点过分了。

  (2)Object.prototype.extend

  先不过你取个extend的名字会让熟悉java的人引起的歧义。修改Object的prototype就说不过去了。不知道作者是怎么考虑的。当你for in循环对象是,麻烦就来了。可能有人会问你for in干吗。 我一个项目中既用了DWR,也用了prototype.js,dwr返回的javascript对象都多了个exetend属性,还得特殊处理。

  以前我比较过dojo和prototype.js中继承的实现,现在我明白个道理。对于javascript这种没有静态类型检查,语法宽松的语言来讲,如果你选择了某个js类库,那你也必须适应作者写javascript的风格。prototype.js的作者对extend的使用炉火纯青,如果我们不当它只是个属性拷贝的函数的话,多读读prototype.js的代码是好的。

  关于事件的注册

script src="prototype1.3.1.js"/scriptinput type=checkbox id=myChk name="chk" value=1 TestscriptEvent.observe(myChk, 'click', showMessage, false);//$('myChk').onclick=showMessage;//$('myChk').onclick=showMessage.bind();$('myChk').onclick=showMessage.bind($('myChk'));function showMessage() {   alert(this.value);}/script

  执行上面代码,你就能明白Event.observe与bind/bindAsEventListener之间的区别:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  (1) 显然Event.observe有限制,只能处理简单的函数,并函数中不能有this之类的东西。

  (2)Event.observe内部用到addEventListener/attachEvent。能把多个函数加到一个触发事件(window.onload)。bind是覆盖。

  关于函数的绑定

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  类库提供了Function.prototype.bind Function.prototype.bindAsEventListener两个方法。首先我们从概念上解释一个这两个方法。

  任何一个函数都可以调用这两个方法;参数的是javascript对象或网页上元素对象;返回类型是个函数对象。

  本来我就是个函数,返回还是函数,到这两个函数有什么不同呢。看实现代码,关键还是applycall函数的代码。其实这里只是转化了一下方法调用的对象。

script src="prototype1.3.1.js"/scriptinput type=checkbox id=myChk name="asf" value=1 Testscript  var CheckboxWatcher = Class.create();  CheckboxWatcher.prototype = {    initialize: function(chkBox, message) {       this.chkBox = $(chkBox);       this.message = message;       this.chkBox.onclick = this.showMessage.bindAsEventListener(this);    },    showMessage: function(evt) {      alert(this.message + ' (' + evt.type + ')');    }  };new CheckboxWatcher('myChk','message!!!!');//$('myChk').onclick=function(){};/script

  这是 https://compdoc2cn.dev.java.net/ 上举的例子,个人感觉没什么意思,反而让我对bind,bindAsEventListener有些反感。(javascript就是这样,明明大家都知道的语法,但写出来的代码差别确很大)

  看下面代码:

script src="prototype1.3.1.js"/scriptinput type=checkbox id=myChk name="chk" value=1 Testscriptfunction Class(){  this.name="class";}Class.prototype.getName=function(){  alert(this.name);}var obj=new Class();//$('myChk').onclick=obj.getName;$('myChk').onclick=obj.getName.bind(obj);//$('myChk').onclick=obj.getName.bind($('myChk'));/script

  从上面代码可以看出bind/bindAsEventListener只是包装了一下apply/call方法,改变方法的调用对象。如例子,你可以把obj.getName方法转化成任何对象调用,并且把方法让表单元素触发。(bind和bindAsEventListener之间只是返回函数的参数不同)

  这两个方法也可以用在对象之间的方法重用,实现类似继承方法的概念。看以下代码,其实是比较无聊的。

script src="prototype1.3.1.js"/scriptscriptfunction Class1(name){  this.name=name;}Class1.prototype.getName=function(){  alert(this.name);}function Class2(name){  this.name=name;  this.getName=Class1.prototype.getName.bind(this);}var obj1=new Class2("yql");obj1.getName();var obj2=new Object();obj2.name="zkj";obj2.fun=Class1.prototype.getName.bind(obj2);obj2.fun();/script

  我从来没读过prototype.js的扩展项目代码,也不知道bind..的最佳实践,一起挖掘吧。但你绝对不要把bind/bindAsEventListener从绑定的词义上来理解,可能会让你更加迷惑。从apply/call理解本质。应用某一对象的一个方法,用另一个对象替换当前对象。

  关于事件监听最佳实践

  很显然prototype.js提供的事件注册方法不是很完善。那看看dojo的时间注册吧(中文版),更加复杂,估计很多人像我一样,对于dojo暂时持观望态度。

  如果你看过的前篇关于闭包的介绍,可能见过以下代码。

  看以下代码前我想表述一个观点,任何网页中元素,浏览器都会为你创建一个对象(见)。(我觉得)这些对象与你建立javascript对象区别是它们有事件监听,会响应鼠标键盘的事件。如果你用了以下代码,那么把事件监听代码很好的转化到你的javascript代码中。

function associateObjWithEvent(obj, methodName){  return (function(e){    e = e||window.event;    return obj[methodName](e, this);  });}  function DhtmlObject(elementId){  var el = getElementWithId(elementId);  if(el){    el.onclick = associateObjWithEvent(this, "doOnClick");    el.onmouseover = associateObjWithEvent(this, "doMouseOver");    el.onmouseout = associateObjWithEvent(this, "doMouseOut");  }}  DhtmlObject.prototype.doOnClick = function(event, element){  ... // doOnClick method body.}DhtmlObject.prototype.doMouseOver = function(event, element){  ... // doMouseOver method body.}DhtmlObject.prototype.doMouseOut = function(event, element){  ... // doMouseOut method body.}

  有时间我想用以上思想实现一个网页浮动框拖拉的代码(其实已经有很多了)

来源:http://www.tulaoshi.com/n/20160219/1612465.html

延伸阅读
标签: Web开发
本文总结网页制作中关于CSS样式表应用的一些基础技巧,希望大家掌握!谢谢支持网页教学网。 一、关于注释 在创建xhtml+CSS网站时,CSS中的注释非常重要。在创建CSS样式时,应当保持随手注释的习惯。一般的,我习惯于使用/* 注释内容 */的格式来写注释,因为在EditPlus等具有高亮功能的编辑器里,使用C语言中常用的/***************/之类...
孕前有哪些优生措施?     孕前期是指从确定婚姻对象到婚后受孕为止的一段时期,包括婚前、新婚及婚后到妊娠前的三个阶段。在此期做好生殖健康保护,能有力地保障健康的婚姻生活,孕育健康的后代。在婚前应适当了解性卫生知识、生育知识和环境优生知识,应防止近亲结婚。       近亲结婚是指直系血...
标签: 孕前
关于准备怀孕的一些疑问 levi~s:帮朋友问,她今年32,中学老师,天天吃粉笔灰。老公,设计制图,天天对着电脑。两人打算要孩子,有几个问题想问大家。 问题一:电脑辐射会影响精子质量和怀孕吗? 问题二:听说男性常年坐姿工作容易生女孩,是真的吗?他们想要儿子。tulaoshi.com 问题三:没做过婚...
    在编程时,经常有一些针对目录的操作,如打开目录对话框选择一个目录,直接创建多级目录,直接删除多级目录,判定某个目录是否存在等。本文就这些问题给出编程实现方法,并给出具体的程序代码,供各位编程爱好者参考。 一、判定目录是否存在:   C++ Builder中提供了检查文件是否存在的函数File...
很多人爱吃枣,喜欢它味道的脆甜,一到季节便买上一部分,回家慢慢享用。不过您知道吗?鲜枣还有缓解压力的功效,不过不宜贪多。下面为您详细介绍有关吃枣的学问。 由于鲜枣皮含有大量的不可溶纤维素,在吃的时候尽量不要“囫囵吞枣”,而要细嚼慢咽,否则可能会引起腹胀等不适的感觉。同时,慢慢咀嚼也是释放压力、平静心情的...

经验教程

121

收藏

60
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部