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 相关文章推荐
JavaScript的变量作用域深入理解
Oct 25 Javascript
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
zShowBox 图片放大展示jquery版 兼容性
Sep 24 Javascript
js中AppendChild与insertBefore的用法详细解析
Dec 16 Javascript
Javascript获取当前时间函数和时间操作小结
Oct 01 Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
JavaScript实现简单的日历效果
Sep 25 Javascript
详解JavaScript常量定义
Jan 03 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
Jan 06 Javascript
vue项目支付功能代码详解
Feb 18 Vue.js
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
PHP 常见郁闷问题答解
2006/11/25 PHP
php 全文搜索和替换的实现代码
2008/07/29 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
javascript的几种写法总结
2016/09/30 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
Python使用folium excel绘制point
2019/01/03 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python 文件数据读写的具体实现
2020/01/24 Python
python 如何调用远程接口
2020/09/11 Python
Python基于execjs运行js过程解析
2020/11/27 Python
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
作文评语集锦大全
2014/04/23 职场文书
公司介绍信范文
2015/01/31 职场文书
集结号观后感
2015/06/08 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL