Object.extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
} Prototype 對Object類進行的擴充主要通過一個靜態函數
Object.extend(destination, source)實現了
JavaScript中的繼承。 從語義的角度,
Object.extend(destination, source)方法有些不和邏輯, 因為它事實上僅僅實現了從來源物件到目標對象的全息拷貝。不過你也可以這樣認為:由於目標對象擁有了所有來源物件所擁有的特性, 所以看上去就像目標對象繼承了來源物件(並加以擴充)一樣。另外, Prototype對Object擴充了幾個比較有用的靜態方法, 所有其他的類可以通過調用這些靜態方法擷取支援。
JScript code
Object.extend = function(destination, source) { // 一個靜態方法表示繼承, 目標對象將擁有來源物件的所有屬性和方法
for (var property in source) {
destination[property] = source[property]; // 利用動態語言的特性, 通過賦值動態添加屬性與方法
}
return destination; // 返回擴充後的對象
}
Object.extend(Object, {
inspect: function(object) { // 一個靜態方法, 傳入一個對象, 返回對象的字串表示
try {
if (object == undefined) return 'undefined'; // 處理undefined情況
if (object == null) return 'null'; // 處理null情況
// 如果對象定義了inspect方法, 則調用該方法返回, 否則返回對象的toString()值
return object.inspect ? object.inspect() : object.toString();
} catch (e) {
if (e instanceof RangeError) return '...'; // 處理異常情況
throw e;
}
},
keys: function(object) { // 一個靜態方法, 傳入一個對象, 返回該對象中所有的屬性, 構成數組返回
var keys = [];
for (var property in object)
keys.push(property); // 將每個屬性壓入到一個數組中
return keys;
},
values: function(object) { // 一個靜態方法, 傳入一個對象, 返回該對象中所有屬性所對應的值, 構成數組返回
var values = [];
for (var property in object) values.push(object[property]); // 將每個屬性的值壓入到一個數組中
return values;
},
clone: function(object) { // 一個靜態方法, 傳入一個對象, 複製一個新對象並返回
return Object.extend({}, object);
}
});