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) {??? // 一個靜態方法, 傳入一個對象, 克隆一個新對象并返回
??? returnObject.extend({}, object);
}
});