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 相关文章推荐
表单内同名元素的控制
Nov 22 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
Dec 02 Javascript
JS将制定内容复制到剪切板示例代码
Feb 11 Javascript
js实现点击切换TAB标签实例
Aug 21 Javascript
对Js OOP编程 创建对象的一些全面理解
Jul 26 Javascript
jquery-mobile表单的创建方法详解
Nov 23 Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 Javascript
react-native-tab-navigator组件的基本使用示例代码
Sep 07 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 Javascript
koa2的中间件功能及应用示例
Mar 05 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 Javascript
详解JS预解析原理
Jun 16 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
浅谈Python浅拷贝、深拷贝及引用机制
2016/12/15 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
Python3.6简单反射操作示例
2018/06/14 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
资深生产主管自我评价
2013/09/22 职场文书
大学生预备党员自我评价分享
2013/11/16 职场文书
饮料业务员岗位职责
2013/12/15 职场文书
劳资专员岗位职责
2013/12/27 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
安全演讲稿大全
2014/05/09 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
小学语文教师研修日志
2015/11/13 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL