PrototypeObject对象学习
2023-06-13 09:14:11 时间
ObjectisusedbyPrototypeasanamespace;thatis,itjustkeepsafewnewmethodstogether,whichareintendedfornamespacedaccess(i.e.startingwith“Object.”).
上面说的namespace个人理解就相当于C#中的静态类,提供工具函数的意思,和C#中的namespace应该不是一个概念。因为C#中的命名空间后面不会直接跟方法,肯定是接一个对象然后在调用方法,不过和C++中的命名空间倒是有些类似
clone
extend
inspect
isArray
isElement
isFunction
isHash
isNumber
isString
isUndefined
keys
toHTML
toJSON
toQueryString
values
复制代码代码如下:
上面说的namespace个人理解就相当于C#中的静态类,提供工具函数的意思,和C#中的namespace应该不是一个概念。因为C#中的命名空间后面不会直接跟方法,肯定是接一个对象然后在调用方法,不过和C++中的命名空间倒是有些类似
clone
extend
inspect
isArray
isElement
isFunction
isHash
isNumber
isString
isUndefined
keys
toHTML
toJSON
toQueryString
values
//通过匿名函数调用的方式创建Object对象
(function(){
//取得类型的字符串表达形式,(Prototype学习——工具函数学习($方法))这篇日志里有详细的说明
functiongetClass(object){
returnObject.prototype.toString.call(object)
.match(/^\[object\s(.*)\]$/)[1];
}
//继承方法,非常简单的类抄写机制,就是把source里面的所有属性和方法复制一份到destination中,如果是引用类型,则source和destination将指向同一个地址
functionextend(destination,source){
for(varpropertyinsource)
destination[property]=source[property];
returndestination;
}
//返回object的字符串表达形式
functioninspect(object){
try{
if(isUndefined(object))return"undefined";
if(object===null)return"null";
returnobject.inspect?object.inspect():String(object);
}catch(e){
if(einstanceofRangeError)return"...";
throwe;
}
}
//返回object的JSON(JavaScriptObjectNotation)
functiontoJSON(object){
vartype=typeofobject;
switch(type){
case"undefined":
case"function":
case"unknown":return;
case"boolean":returnobject.toString();
}
if(object===null)return"null";
if(object.toJSON)returnobject.toJSON();
if(isElement(object))return;
varresults=[];
for(varpropertyinobject){
varvalue=toJSON(object[property]);
if(!isUndefined(value))
results.push(property.toJSON()+":"+value);
}
return"{"+results.join(",")+"}";
}
//返回查询字符串,例如:param1=value1¶m2=value2
functiontoQueryString(object){
return$H(object).toQueryString();
}
//返回HTML字符串
functiontoHTML(object){
returnobject&&object.toHTML?object.toHTML():String.interpret(object);
}
//取得object的所有key
functionkeys(object){
varresults=[];
for(varpropertyinobject)
results.push(property);
returnresults;
}
//取得object的所有value
functionvalues(object){
varresults=[];
for(varpropertyinobject)
results.push(object[property]);
returnresults;
}
//把object中的所有属性和方法拷贝到一个空对象中,并返回
functionclone(object){
returnextend({},object);
}
//判断object是不是基本的DOMElement
functionisElement(object){
return!!(object&&object.nodeType==1);
}
//判断object是否为数组
functionisArray(object){
returngetClass(object)==="Array";
}
//判断object是否为Prototype的Hash对象
functionisHash(object){
returnobjectinstanceofHash;
}
//判断object是否为函数
functionisFunction(object){
returntypeofobject==="function";
}
//判断object是否为字符串
functionisString(object){
returngetClass(object)==="String";
}
//判断object是否为数字
functionisNumber(object){
returngetClass(object)==="Number";
}
//判断object是否已经定义
functionisUndefined(object){
returntypeofobject==="undefined";
}
//返回Object对象
extend(Object,{
extend:extend,
inspect:inspect,
toJSON:toJSON,
toQueryString:toQueryString,
toHTML:toHTML,
keys:keys,
values:values,
clone:clone,
isElement:isElement,
isArray:isArray,
isHash:isHash,
isFunction:isFunction,
isString:isString,
isNumber:isNumber,
isUndefined:isUndefined
});
})();
inspect方法:
Object.inspect()//->"undefined"
Object.inspect(null)//->"null"
Object.inspect(false)//->"false"
Object.inspect([1,2,3])//->"[1,2,3]"
Object.inspect("hello")//->""hello""
toJSON方法:
注意这里面有一个递归调用的过程varvalue=toJSON(object[property]);最后返回一个JSON格式的字符串表示,下面看一下示例:
vardata={name:"Violet",occupation:"character",age:25,pets:["frog","rabbit"]};
/*"{"name":"Violet","occupation":"character","age":25,"pets":["frog","rabbit"]}"*/
//在eval返回的JSON字符串时要记住加上括号,否则报错,这里括号起到强制求值的作用。
//要不然会把JSON字串当成复合语句,里面的("name":)当成Label,然后解析后面的内容就会出错了
varobj=eval("("+Object.toJSON(data)+")");
alert(obj.name);
toQueryString方法:
用object创建一个Hash对象,然后调用Hash对象的toQueryString方法,并返回调用结果,讲到Hash对象时在详细说toQueryString方法。
一般这个方法在调用Ajax.Request时会经常用到,下面看一下示例:
Object.toQueryString({action:"ship",order_id:123,fees:["f1","f2"],"label":"ademo"})
//->"action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo"
toHTML方法:
如果传进去的object参数为undefined或者null将返回空字符串
alert(Object.toHTML())
alert(Object.toHTML(null))
如果object定义了toHTML方法,则调用object的toHTML方法,否者调用String的静态方法interpret,其实就是判断一下object是否为null,为null则返回"",否则调用object的toString方法,并返回调用结果
Object.extend(String,{
interpret:function(value){
returnvalue==null?"":String(value);
},
specialChar:{
"\b":"\\b",
"\t":"\\t",
"\n":"\\n",
"\f":"\\f",
"\r":"\\r",
"\\":"\\\\"
}
});
下面看一下示例:
varBookmark=Class.create({
initialize:function(name,url){
this.name=name;
this.url=url;
},
toHTML:function(){
return"<ahref="#{url}"href="#{url}">#{name}</a>".interpolate(this);
}
});
varapi=newBookmark("PrototypeAPI","http://prototypejs.org/api");
Object.toHTML(api);
//->"<ahref="http://prototypejs.org/api"href="http://prototypejs.org/api">PrototypeAPI</a>"
keys和values方法:
看一下示例就明白了,就不多说了:
Object.keys()
//->[]
Object.keys({name:"Prototype",version:1.5}).sort()
//->["name","version"]
Object.values()
//->[]
Object.values({name:"Prototype",version:1.5}).sort()
//->[1.5,"Prototype"]
clone方法:
"{}"就是空对象的直接量,相当于newObject()
varo={name:"Prototype",version:1.5,authors:["sam","contributors"]};
varo2=Object.clone(o);
o2.version="1.5weird";
o2.authors.pop();
o.version//->1.5
o2.version//->"1.5weird"
o.authors//->["sam"]
//Ouch!Shallowcopy!,注意这里!
isXXX方法不说了吧。
相关文章
- 32.HttpRequest对象的学习
- SpringCloud系列之@SpringQueryMap传Bean对象数据
- JavaScript 对象
- JS学习笔记 (三) 对象进阶
- 客服系统前端开发:navigator对象能获取到的访客浏览器信息【唯一客服】网站在线客服系统
- Java的学习笔记(10)对象 五
- JS Object对象的静态函数
- aspadodb.stream对象的方法/属性
- PrototypeFunction对象学习
- PrototypeClass对象学习
- PrototypeTemplate对象学习
- PrototypeString对象学习
- jquery学习之一对象访问
- 解析dom中的children对象数组元素firstChild,lastChild的使用
- JavaScript对象学习经验整理
- 三种方式获取XMLHttpRequest对象
- C#中遍历DataSet数据集对象实例