Comencé a codificar en Javascript a principios de este año. Me resulta difícil descubrir algunos de los conceptos clave de Javascript, especialmente la herencia de prototipos. Aprendí del libro de Douglas Crockford que si aumentas Function.prototype, puedes hacer que un método esté disponible para todas las funciones. Y, ahí viene este código ...

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Probé el siguiente código del libro y funciona.

String.method('trim',function(){
    return this.replace(/^\s+|\s+$/g, '');
});

console.log('"'+'    neat    '.trim() + '"');

Luego, intenté crear una función personalizada y aumentarle un método.

function Foo()
{
};

Foo.method('test', function() {
    return "This is a test!";
});

console.log(Foo.test());

De hecho, probé console.log con diferentes combinaciones Foo, test (), proto , etc., pero no pude obtener "¡Esto es una prueba!" impreso. ¿Alguien podría ayudar?

0
Victor Gau 1 sep. 2014 a las 07:14

3 respuestas

La mejor respuesta

En realidad, "string" es una instancia de la clase String. Así que solo crea una instancia de tu clase y debería funcionar.

function Foo()
{
};

Foo.method('test', function() {
    return "This is a test!";
});

console.log(new Foo().test());
1
Daniel Aranda 1 sep. 2014 a las 03:21

Trim () es un método de String.prototype que ya se encuentra en versiones modernas de Javascript, por lo que no es un gran ejemplo para probar. Omita el paso adicional y la función prototipo usted mismo:

Function.prototype.test = function(){
    return "This is a test!";
}

function Foo(){
}

console.log(Foo.test());
// logs "This is a test!"
0
James L. 1 sep. 2014 a las 03:21

Hay una diferencia entre cómo llama a su método en su ejemplo String y su ejemplo Foo. En el ejemplo String, lo estás llamando en una instancia de String:

'    neat    '.trim()

Mientras que lo estás llamando en la función de clase Foo:

Foo.test()

Consulte la explicación de la cadena de prototipos en Mozilla. Esto va a sonar extraño, porque siempre confunde a las personas, pero el prototipo no es el [[Prototipo]] . Cuando Javascript busca propiedades heredadas, mira el [[Prototype]], que se asigna en la creación de objetos. Si desea establecer [[Prototype]] para instancias de una clase, configure la propiedad prototype en la función constructora. Así es como lo pienso:

function Foo() {};
Foo.prototype = {...};
// note:
//   Foo.prototype == {...}
//   Foo.[[Prototype]] == Function.prototype
var foo = new Foo();
// note:
//   foo.prototype is undefined
//   foo.[[Prototype]] == Foo.prototype
0
ldgabbay 1 sep. 2014 a las 03:33