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 相关文章推荐
HTML代码中标签的全部属性 中文注释说明
Mar 26 Javascript
自己的js工具 Cookie 封装
Aug 21 Javascript
Javascript 八进制转义字符(8进制)
Apr 08 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
js网页版计算器的简单实现
Jul 02 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
Bootstrap每天必学之响应式导航、轮播图
Apr 25 Javascript
js 判断附件后缀的简单实现方法
Oct 11 Javascript
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
May 27 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
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
图书管理程序(三)
2006/10/09 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
简单了解Python中的几种函数
2017/11/03 Python
python版本单链表实现代码
2018/09/28 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
资深财务管理人员自我评价
2013/09/22 职场文书
销售业务员岗位职责
2014/01/29 职场文书
村官2015年度工作总结
2015/10/14 职场文书