2010-12-13 4 views
3

J'ai lu le code source du Prototype tout en apprenant Javascript. Je me demandais où est le code qui est utilisé pour étendre les objets natifs.Comment Prototype étend-il les objets?

J'ai été voir,

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

partout et je ne peux pas trouver où la fonction .extend vient.

Je l'ai vu:

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

à la ligne 194-198 et je me demande si cela est celui-là. Je ne peux pas savoir comment c'est, si c'est le cas. Quoi qu'il en soit, ma question, comme je l'ai dit plus haut, est de savoir comment/où Prototype étend les objets natifs.

Répondre

3

Oui, il est la fonction que vous voyez, plus tard dans le code que vous verrez il utilisé pour obtenir Object.extend, comme ceci:

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 
}); 

il est donc d'appeler extend() avec lui-même comme une propriété à ajouter au Object prototype, en ajoutant lui-même comme la méthode .extend sur Object.

+0

Je pense que je comprends ce que vous voulez dire ici: keys: Object.keys. Donc Object.keys sont en fait les propriétés de l'objet. Qu'est-ce que l'autre '|| les clés font ici? –

+0

@Thorpe - Il dit si * déjà * a 'Object.keys' (une version native du navigateur), utilisez-le, sinon utilisez la fonction' keys' définie dans ce fichier: https://github.com/sstephenson /prototype/blob/master/src/prototype/lang/object.js#L308-317 –

+1

Je le pensais :) Je crois que votre réponse était la meilleure pour expliquer les choses. +1 –

Questions connexes