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 闭包深入理解(closure)
May 27 Javascript
PNG背景在不同浏览器下的应用
Jun 22 Javascript
javascript重写alert方法的实例代码
Mar 29 Javascript
jquery.post用法示例代码
Jan 03 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
Jul 10 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
Jan 17 Javascript
限时抢购-倒计时的完整实例(分享)
Sep 17 Javascript
js实时监控文本框输入字数的实例代码
Jan 18 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 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
php header示例代码(推荐)
2010/09/08 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
利用Python实现Windows定时关机功能
2017/03/21 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python 实现兔子生兔子示例
2019/11/21 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
傲盾软件面试题
2015/08/17 面试题
出纳岗位职责
2013/11/09 职场文书
个人简历自荐信
2013/12/05 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
新春文艺演出主持词
2014/03/27 职场文书
银行求职信范文
2014/05/26 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
加班费申请报告
2015/05/15 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL