2010-12-13 90 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