Prototype 学习 Prototype对象


Posted in Javascript onJuly 12, 2009

环境:
Prototype Version: '1.6.1_rc3'
Aptana Studio, build: 1.2.5.023247
IE7
FF2.0.0.4
Opera 10 beta

var Prototype = { 
Version: '1.6.1_rc3', 
//定义浏览器对象 
Browser: (function(){ 
var ua = navigator.userAgent; 
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 
return { 
IE: !!window.attachEvent && !isOpera, 
Opera: isOpera, 
WebKit: ua.indexOf('AppleWebKit/') > -1, 
Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, 
MobileSafari: /Apple.*Mobile.*Safari/.test(ua) 
} 
})(), 
//定义浏览器Feature对象 
BrowserFeatures: { 
XPath: !!document.evaluate, 
SelectorsAPI: !!document.querySelector, 
ElementExtensions: (function() { 
var constructor = window.Element || window.HTMLElement; 
return !!(constructor && constructor.prototype); 
})(), 
SpecificElementExtensions: (function() { 
if (typeof window.HTMLDivElement !== 'undefined') 
return true; 
var div = document.createElement('div'); 
var form = document.createElement('form'); 
var isSupported = false; 
if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { 
isSupported = true; 
} 
div = form = null; 
return isSupported; 
})() 
}, 
ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', 
JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, 
emptyFunction: function() { }, 
K: function(x) { return x } 
}; 
if (Prototype.Browser.MobileSafari) 
Prototype.BrowserFeatures.SpecificElementExtensions = false;

Broswer对象是通过调用匿名函数并且立即执行的方式返回的,执行匿名函数的方法有三种:
1. (function(){return 1})() //()可以强制求值,返回函数对象然后执行函数
2. (function(){return 1}()) //返回函数执行的结果
3. void function(){alert(1)}() //void 也有强制运算的用法
其中判断Opera的方法isOpera用到了window.opera,在Opera浏览器中会返回一个对象,其它浏览器返回undefined
BrowserFeatures对象主要判断浏览器的一些特性,FF支持许多的特性在IE下不支持,比如document.evalute方法就可以通过XPATH的方式操作HTML文档,但IE就不支持。
此函数详细用法如下:
var xpathResult = document.evaluate(xpathExpression, contextNode, namespaceResolver, resultType, result);

The evaluate function takes a total of five arguments:
xpathExpression: A string containing an xpath expression to be evaluated
contextNode: A node in the document against which the Xpath expression should be evaluated
namespaceResolver: A function that takes a string containing a namespace prefix from the xpathExpression and returns a string containing the URI to which that prefix corresponds. This enables conversion between the prefixes used in the XPath expressions and the (possibly different) prefixes used in the document
resultType: A numeric constant indicating the type of result that is returned. These constants are avaliable in the global XPathResult object and are defined in the relevaant section of the XPath Spec. For most purposes it's OK to pass in XPathResult.ANY_TYPE which will cause the results of the Xpath expression to be returned as the most natural type
result:An existing XPathResult to use for the results. Passing null causes a new XPathResult to be created.
其中__proto__这个在FF下可以取得对象的prototype对象,即对象的原型。这也是javascript继承机制的基础,基于原型的继承,不像通常的C++,JAVA,C#语言的基于类的继承。还有一种metaclass的继承方式,在ruby和python中常有应用。
其中ScriptFragment定义网页中引用脚本的正则表达式
JSONFilter:还是引用prototype原文的解释更清楚他的用法——
/*String#evalJSON internally calls String#unfilterJSON and automatically removes optional security comment delimiters (defined in Prototype.JSONFilter).*/ person = '/*-secure-\n{"name": "Violet", "occupation": "character"}\n*/'.evalJSON() person.name; //-> "Violet" 
/*You should always set security comment delimiters (/*-secure-\n...*/) around sensitive JSON or JavaScript data to prevent Hijacking. (See this PDF document for more details.)*/

Prototype.K就是返回第一个参数的方法:
Prototype.K('hello world!'); // -> 'hello world!' 
Prototype.K(1.5); // -> 1.5 
Prototype.K(Prototype.K); // -> Prototype.K

说明一下JavaScript里面的静态方法和实例方法
静态方法要这样扩展:
Date.toArray=function(){}
那么toArray方法就是Date的静态方法,不能这样调用(new Date()).toArray();否则会抛出异常
要这样用:Date.toArray()
实例方法要这样扩展:
Date.prototype.toArray2=function(){}
那么toArray2方法就是Date的实例方法了,不能这样调用Date.toArray2();
要这样用:(new Date()).toArray2()
Javascript 相关文章推荐
浅析tr的隐藏和显示问题
Mar 05 Javascript
jQuery中prevUntil()方法用法实例
Jan 08 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
每天一篇javascript学习小结(RegExp对象)
Nov 17 Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 Javascript
JS获取当前页面名称的简单实例
Aug 19 Javascript
vuex中使用对象展开运算符的示例
Sep 25 Javascript
JavaScript静态作用域和动态作用域实例详解
Jun 17 Javascript
vue router动态路由设置参数可选问题
Aug 21 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
Sep 21 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 Javascript
解决element-ui的下拉框有值却无法选中的情况
Nov 07 Javascript
javascript 动态加载 css 方法总结
Jul 11 #Javascript
checkbox 复选框不能为空
Jul 11 #Javascript
javascript 页面只自动刷新一次
Jul 10 #Javascript
javascript div 遮罩层封锁整个页面
Jul 10 #Javascript
JQuery 实现的页面滚动时浮动窗口控件
Jul 10 #Javascript
javascript 读取xml,写入xml 实现代码
Jul 10 #Javascript
jquery 1.3.2 IE8中的一点点的小问题解决方法
Jul 10 #Javascript
You might like
discuz安全提问算法
2007/06/06 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
python中文件变化监控示例(watchdog)
2017/10/16 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
python中pow函数用法及功能说明
2020/12/04 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
小学生竞选班长演讲稿
2014/04/24 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
2014年行政工作总结
2014/11/19 职场文书
目标责任书格式范文
2015/05/11 职场文书