Prototype如何扩展对象?
我一直在阅读原型的源代码,同时学习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对象。
是的,这是你看到的功能,在后面的代码,你会看到它用于获取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
方法。
嗯...我在哪里找到这条线? – 2010-12-13 18:27:15
@Thorpe Line 567 – 2010-12-13 18:27:36
@Thorpe - https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/object.js#L567-584 – 2010-12-13 18:35:40
我想我在这里得到你的意思:keys:Object.keys。所以Object.keys实际上是对象属性。另一个'||是什么?钥匙'在这里? – 2010-12-13 19:17:41
@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 – 2010-12-13 19:24:48