2010-12-13 127 views
3

我一直在閱讀原型的源代碼,同時學習Javascript。我一直在想知道用於擴展Native Objects的代碼在哪裏。Prototype如何擴展對象?

我已經看到,

Object.extend(Function.prototype, (function() { 
Object.extend(String.prototype, (function() { 
Object.extend(Number.prototype, (function() { 

所有的地方,我不能尋找到.extend功能的來源。

我已經看到了這一點:

function extend(destination, source) { 
    for (var property in source) 
     destination[property] = source[property]; 
    return destination; 
    } 

在行194-198,不知道是否這是一個。如果是的話,我不知道它是怎麼回事。

無論如何,我的問題如上所述是Prototype如何擴展Native對象。

回答

3

是的,這是你看到的功能,在後面的代碼,你會看到它用於獲取Object.extend,像這樣:

extend(Object, { 
    extend: extend, //here's where the magic gets added 
    inspect: inspect, 
    toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, 
    toQueryString: toQueryString, 
    toHTML: toHTML, 
    keys: Object.keys || keys, 
    values: values, 
    clone: clone, 
    isElement: isElement, 
    isArray: isArray, 
    isHash: isHash, 
    isFunction: isFunction, 
    isString: isString, 
    isNumber: isNumber, 
    isDate: isDate, 
    isUndefined: isUndefined 
}); 

所以它調用extend()與本身作爲一個屬性添加到Object原型,在Object上自己添加爲.extend方法。

+0

我想我在這裏得到你的意思:keys:Object.keys。所以Object.keys實際上是對象屬性。另一個'||是什麼?鑰匙'在這裏? – 2010-12-13 19:17:41

+0

@Thorpe - 這是說如果它*已經*具有Object.keys(本地瀏覽器版本),那麼使用它,如果不是,那麼使用該文件中定義的'keys'函數:https://github.com/sstephenson /prototype/blob/master/src/prototype/lang/object.js#L308-317 – 2010-12-13 19:23:05

+1

我認爲是這樣:)我相信你的回答是最好的解釋事情。 +1 – 2010-12-13 19:24:48