Prototype Object對象 學(xué)習(xí)
更新時間:2009年07月12日 22:19:25 作者:
該不是一個概念。因為C#中的命名空間后面不會直接跟方法,肯定是接一個對象然后在調(diào)用方法,不過和C++中的命名空間倒是有些類似
Object is used by Prototype as a namespace; that is, it just keeps a few new methods together, which are intended for namespaced access (i.e. starting with “Object.”).
上面說的namespace個人理解就相當(dāng)于C#中的靜態(tài)類,提供工具函數(shù)的意思,和C#中的namespace應(yīng)該不是一個概念。因為C#中的命名空間后面不會直接跟方法,肯定是接一個對象然后在調(diào)用方法,不過和C++中的命名空間倒是有些類似
clone
extend
inspect
isArray
isElement
isFunction
isHash
isNumber
isString
isUndefined
keys
toHTML
toJSON
toQueryString
values
//通過匿名函數(shù)調(diào)用的方式創(chuàng)建Object對象
(function() {
//取得類型的字符串表達形式,(Prototype 學(xué)習(xí)——工具函數(shù)學(xué)習(xí)($方法))這篇日志里有詳細的說明
function getClass(object) {
return Object.prototype.toString.call(object)
.match(/^\[object\s(.*)\]$/)[1];
}
//繼承方法,非常簡單的類抄寫機制,就是把source里面的所有屬性和方法復(fù)制一份到destination中,如果是引用類型,則source和destination將指向同一個地址
function extend(destination, source) {
for (var property in source)
destination[property] = source[property];
return destination;
}
//返回object的字符串表達形式
function inspect(object) {
try {
if (isUndefined(object)) return 'undefined';
if (object === null) return 'null';
return object.inspect ? object.inspect() : String(object);
} catch (e) {
if (e instanceof RangeError) return '...';
throw e;
}
}
//返回object的JSON(JavaScript Object Notation)
function toJSON(object) {
var type = typeof object;
switch (type) {
case 'undefined':
case 'function':
case 'unknown': return;
case 'boolean': return object.toString();
}
if (object === null) return 'null';
if (object.toJSON) return object.toJSON();
if (isElement(object)) return;
var results = [];
for (var property in object) {
var value = toJSON(object[property]);
if (!isUndefined(value))
results.push(property.toJSON() + ': ' + value);
}
return '{' + results.join(', ') + '}';
}
//返回查詢字符串,例如:param1=value1¶m2=value2
function toQueryString(object) {
return $H(object).toQueryString();
}
//返回HTML字符串
function toHTML(object) {
return object && object.toHTML ? object.toHTML() : String.interpret(object);
}
//取得object的所有key
function keys(object) {
var results = [];
for (var property in object)
results.push(property);
return results;
}
//取得object的所有value
function values(object) {
var results = [];
for (var property in object)
results.push(object[property]);
return results;
}
//把object中的所有屬性和方法拷貝到一個空對象中,并返回
function clone(object) {
return extend({ }, object);
}
//判斷object是不是基本的DOM Element
function isElement(object) {
return !!(object && object.nodeType == 1);
}
//判斷object是否為數(shù)組
function isArray(object) {
return getClass(object) === "Array";
}
//判斷object是否為Prototype 的 Hash 對象
function isHash(object) {
return object instanceof Hash;
}
//判斷object是否為函數(shù)
function isFunction(object) {
return typeof object === "function";
}
//判斷object是否為字符串
function isString(object) {
return getClass(object) === "String";
}
//判斷object是否為數(shù)字
function isNumber(object) {
return getClass(object) === "Number";
}
//判斷object是否已經(jīng)定義
function isUndefined(object) {
return typeof object === "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方法:
注意這里面有一個遞歸調(diào)用的過程var value = toJSON(object[property]);最后返回一個JSON格式的字符串表示,下面看一下示例:
var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
/* '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}' */
//在eval返回的JSON字符串時要記住加上括號,否則報錯,這里括號起到強制求值的作用。
//要不然會把JSON字串當(dāng)成復(fù)合語句,里面的("name":)當(dāng)成Label,然后解析后面的內(nèi)容就會出錯了
var obj=eval('('+Object.toJSON(data)+')');
alert(obj.name);
toQueryString方法:
用object創(chuàng)建一個Hash對象,然后調(diào)用Hash對象的toQueryString方法,并返回調(diào)用結(jié)果,講到Hash對象時在詳細說toQueryString方法。
一般這個方法在調(diào)用Ajax.Request時會經(jīng)常用到,下面看一下示例:
Object.toQueryString({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' })
// -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'
toHTML方法:
如果傳進去的object參數(shù)為undefined或者null將返回空字符串
alert(Object.toHTML())
alert(Object.toHTML(null))
如果object定義了toHTML方法,則調(diào)用object的toHTML方法,否者調(diào)用String的靜態(tài)方法interpret,其實就是判斷一下object是否為null,為null則返回'',否則調(diào)用object的toString方法,并返回調(diào)用結(jié)果
Object.extend(String, {
interpret: function(value) {
return value == null ? '' : String(value);
},
specialChar: {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'\\': '\\\\'
}
});
下面看一下示例:
var Bookmark = Class.create({
initialize: function(name, url) {
this.name = name;
this.url = url;
},
toHTML: function() {
return '<a href="#{url}" href="#{url}">#{name}</a>'.interpolate(this);
}
});
var api = new Bookmark('Prototype API', 'http://prototypejs.org/api');
Object.toHTML(api);
//-> '<a >Prototype API</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方法:
'{}'就是空對象的直接量,相當(dāng)于new Object()
var o = { name: 'Prototype', version: 1.5, authors: ['sam', 'contributors'] };
var o2 = Object.clone(o);
o2.version = '1.5 weird';
o2.authors.pop();
o.version // -> 1.5
o2.version // -> '1.5 weird'
o.authors // -> ['sam']
// Ouch! Shallow copy!,注意這里!
isXXX方法不說了吧。
上面說的namespace個人理解就相當(dāng)于C#中的靜態(tài)類,提供工具函數(shù)的意思,和C#中的namespace應(yīng)該不是一個概念。因為C#中的命名空間后面不會直接跟方法,肯定是接一個對象然后在調(diào)用方法,不過和C++中的命名空間倒是有些類似
clone
extend
inspect
isArray
isElement
isFunction
isHash
isNumber
isString
isUndefined
keys
toHTML
toJSON
toQueryString
values
復(fù)制代碼 代碼如下:
//通過匿名函數(shù)調(diào)用的方式創(chuàng)建Object對象
(function() {
//取得類型的字符串表達形式,(Prototype 學(xué)習(xí)——工具函數(shù)學(xué)習(xí)($方法))這篇日志里有詳細的說明
function getClass(object) {
return Object.prototype.toString.call(object)
.match(/^\[object\s(.*)\]$/)[1];
}
//繼承方法,非常簡單的類抄寫機制,就是把source里面的所有屬性和方法復(fù)制一份到destination中,如果是引用類型,則source和destination將指向同一個地址
function extend(destination, source) {
for (var property in source)
destination[property] = source[property];
return destination;
}
//返回object的字符串表達形式
function inspect(object) {
try {
if (isUndefined(object)) return 'undefined';
if (object === null) return 'null';
return object.inspect ? object.inspect() : String(object);
} catch (e) {
if (e instanceof RangeError) return '...';
throw e;
}
}
//返回object的JSON(JavaScript Object Notation)
function toJSON(object) {
var type = typeof object;
switch (type) {
case 'undefined':
case 'function':
case 'unknown': return;
case 'boolean': return object.toString();
}
if (object === null) return 'null';
if (object.toJSON) return object.toJSON();
if (isElement(object)) return;
var results = [];
for (var property in object) {
var value = toJSON(object[property]);
if (!isUndefined(value))
results.push(property.toJSON() + ': ' + value);
}
return '{' + results.join(', ') + '}';
}
//返回查詢字符串,例如:param1=value1¶m2=value2
function toQueryString(object) {
return $H(object).toQueryString();
}
//返回HTML字符串
function toHTML(object) {
return object && object.toHTML ? object.toHTML() : String.interpret(object);
}
//取得object的所有key
function keys(object) {
var results = [];
for (var property in object)
results.push(property);
return results;
}
//取得object的所有value
function values(object) {
var results = [];
for (var property in object)
results.push(object[property]);
return results;
}
//把object中的所有屬性和方法拷貝到一個空對象中,并返回
function clone(object) {
return extend({ }, object);
}
//判斷object是不是基本的DOM Element
function isElement(object) {
return !!(object && object.nodeType == 1);
}
//判斷object是否為數(shù)組
function isArray(object) {
return getClass(object) === "Array";
}
//判斷object是否為Prototype 的 Hash 對象
function isHash(object) {
return object instanceof Hash;
}
//判斷object是否為函數(shù)
function isFunction(object) {
return typeof object === "function";
}
//判斷object是否為字符串
function isString(object) {
return getClass(object) === "String";
}
//判斷object是否為數(shù)字
function isNumber(object) {
return getClass(object) === "Number";
}
//判斷object是否已經(jīng)定義
function isUndefined(object) {
return typeof object === "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方法:
復(fù)制代碼 代碼如下:
Object.inspect() // -> 'undefined'
Object.inspect(null) // -> 'null'
Object.inspect(false) // -> 'false'
Object.inspect([1, 2, 3]) // -> '[1, 2, 3]'
Object.inspect('hello') // -> "'hello'"
toJSON方法:
注意這里面有一個遞歸調(diào)用的過程var value = toJSON(object[property]);最后返回一個JSON格式的字符串表示,下面看一下示例:
復(fù)制代碼 代碼如下:
var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
/* '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}' */
//在eval返回的JSON字符串時要記住加上括號,否則報錯,這里括號起到強制求值的作用。
//要不然會把JSON字串當(dāng)成復(fù)合語句,里面的("name":)當(dāng)成Label,然后解析后面的內(nèi)容就會出錯了
var obj=eval('('+Object.toJSON(data)+')');
alert(obj.name);
toQueryString方法:
用object創(chuàng)建一個Hash對象,然后調(diào)用Hash對象的toQueryString方法,并返回調(diào)用結(jié)果,講到Hash對象時在詳細說toQueryString方法。
一般這個方法在調(diào)用Ajax.Request時會經(jīng)常用到,下面看一下示例:
復(fù)制代碼 代碼如下:
Object.toQueryString({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' })
// -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'
toHTML方法:
如果傳進去的object參數(shù)為undefined或者null將返回空字符串
alert(Object.toHTML())
alert(Object.toHTML(null))
如果object定義了toHTML方法,則調(diào)用object的toHTML方法,否者調(diào)用String的靜態(tài)方法interpret,其實就是判斷一下object是否為null,為null則返回'',否則調(diào)用object的toString方法,并返回調(diào)用結(jié)果
復(fù)制代碼 代碼如下:
Object.extend(String, {
interpret: function(value) {
return value == null ? '' : String(value);
},
specialChar: {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'\\': '\\\\'
}
});
下面看一下示例:
復(fù)制代碼 代碼如下:
var Bookmark = Class.create({
initialize: function(name, url) {
this.name = name;
this.url = url;
},
toHTML: function() {
return '<a href="#{url}" href="#{url}">#{name}</a>'.interpolate(this);
}
});
var api = new Bookmark('Prototype API', 'http://prototypejs.org/api');
Object.toHTML(api);
//-> '<a >Prototype API</a>'
keys和values方法:
看一下示例就明白了,就不多說了:
復(fù)制代碼 代碼如下:
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方法:
'{}'就是空對象的直接量,相當(dāng)于new Object()
復(fù)制代碼 代碼如下:
var o = { name: 'Prototype', version: 1.5, authors: ['sam', 'contributors'] };
var o2 = Object.clone(o);
o2.version = '1.5 weird';
o2.authors.pop();
o.version // -> 1.5
o2.version // -> '1.5 weird'
o.authors // -> ['sam']
// Ouch! Shallow copy!,注意這里!
isXXX方法不說了吧。
相關(guān)文章
Prototype源碼淺析 String部分(三)之HTML字符串處理
現(xiàn)在,String部分轉(zhuǎn)入具體的關(guān)聯(lián)應(yīng)用,分別對應(yīng)HTML字符串,JSON字符串和HTML中的腳本字符串2012-01-01由prototype_1.3.1進入javascript殿堂-類的初探
由prototype_1.3.1進入javascript殿堂-類的初探...2006-11-11初學(xué)prototype,發(fā)個JS接受URL參數(shù)的代碼
初學(xué)prototype,發(fā)個JS接受URL參數(shù)的代碼...2006-09-09prototype 1.5 & scriptaculous 1.6.1 學(xué)習(xí)筆記
prototype 1.5 & scriptaculous 1.6.1 學(xué)習(xí)筆記...2006-09-09Prototype Selector對象學(xué)習(xí)
這個對象在幫助文檔上并沒有,但是這個對象確是整個DOM操作的核心類,工具函數(shù)$$,其實就是調(diào)用這個類的方法2009-07-07不錯的一篇關(guān)于javascript-prototype繼承
不錯的一篇關(guān)于javascript-prototype繼承...2007-08-08Prototype ObjectRange對象學(xué)習(xí)
ObjectRange對象基本就是實現(xiàn)了連續(xù)的數(shù)字或者字符串,其中只包含一個方法,include,判斷某個數(shù)字或者字符串是否在ObjectRange里。并且ObjectRange對象還混入了Enumerable的方法,所以可以直接在ObjectRange對象上調(diào)用Enumerable對象里面的方法。2009-07-07