0

Leyendo sobre JS, se dice que: "según cada tipo de dato, estos tendrán cualidades heredadas, por lo que poseerán propiedades diferentes para cada tipo".

Podemos observar eso en el caso de los string:

var nombre = "Victor";

una propiedad propia (XD) seria length.

nombre.length = "6".

Ahora bien, cada tipo de dato tiene sus propiedades, pero también existen los métodos.

"un método es una acción que ejecutamos sobre los datos de un objeto".

toUpperCase toLowerCase Split Bind Blur Click etc etc etc.

Como se establece que son acciones sobre los datos, y según cada dato hay propiedades especificas: se podría hablar de que los métodos también son heredados para cada tipo de dato?.

esto porque he visto que algunos métodos solo servirían para un tipo especifico:

nombre.toUpperCase() = VICTOR.

Esto quiere decir que los datos heredan propiedades y métodos?

ó

Que existen métodos heredables y métodos generales?

porque no creo que se pueda hacer

var numero = 12345;

numero.toUpperCase;
Rubén
  • 10,857
  • 6
  • 35
  • 79
Dev 200
  • 5,246
  • 5
  • 39
  • 80
  • 1
    Por los tipos de variables. un variable de tipo `número` no posee dicho método. solo los de tipo `String` – Dev. Joel Apr 08 '17 at 16:38
  • 1
    A eso quiero llegar, que he visto metodos para tipos especificos y otros generales – Dev 200 Apr 08 '17 at 16:40
  • Pues podria ser que si, ya que dependiendo el tipo de dato, entonces tendría o no, ciertos métodos propios para cada uno, o dependiendo lo que quieras hacer. – Pedro Miguel Pimienta Morales Apr 08 '17 at 16:42
  • Debe evitarse el incluir etiquetas en el título. Referencia [¿Qué son las etiquetas y cómo debo usarlas?](https://es.stackoverflow.com/help/tagging). Por lo anterior, edité la pregunta. – Rubén Jul 10 '17 at 02:43

2 Answers2

2

En JavaScript el elemento fundamental es el objeto. Existen objetos globales, pero no propiedades ni métodos globales en el sentido de que estos no pueden existir sin un objeto.

El que haya propiedades iguales, como la longitud, para objetos distintos, es una característica de los lenguajes orientados a objetos, la cual se llama polimorfismo. En el Índice de propiedades Javascript se listan todas las propiedades estándar de Javascript en orden alfabético.

En Javascript, no existen métodos en el sentido que le dan los lenguajes basados en clases. Las funciones se agregan a los objetos como propiedades y son llamadas métodos. En Índice de métodos Javascript se listan todos los métodos en en orden alfabético.

Cabe hacer notar que nn los índices referidos arriba se incluye un elemento por cada propiedad y método incluso para las que se llaman igual, por un lado porque cada una se define para el objeto que corresponden y por ende cada una tiene su propia página de documentación.

De Tipos de datos y estructuras en JavaScript

En JavaScript existen 6 tipos de datos primitivos

  • Boleano boolean
  • Nulo null
  • Indefinido undefined
  • Número number
  • Cadena string

y

  • objeto object

Cada uno de estos tiene un objeto del mismo nombre como envoltorio wrapper.

De Herencia y la cadena de prototipos

Herencia con la cadena de prototipos

Heredando propiedades

Los objetos JavaScript son "bolsas" dinámicas de propiedades que tienen un enlace a un objeto prototipo. Cuando intentamos acceder a una propiedad de un objeto, la propiedad no sólo se buscará en el propio objeto sino también en el prototipo del objeto, en el prototipo del prototipo, y así sucesivamente hasta que se encuentre una propiedad que coincida con el nombre o se alcance el final de la cadena de prototipos.

...

Dar valor a una propiedad de un objeto crea una propiedad. La única excepción a las reglas de funcionamiento de obtener y dar valores ocurre cuando hay una propiedad heredada con un getter o un setter.

Heredando "métodos"

JavaScript no tiene "métodos" en la forma que los lenguajes basados en clases los define. En JavaScript, cualquier función puede añadirse a un objeto como una propiedad. Una función heredada se comporta como cualquier otra propiedad, viéndose afectada por el solapamiento de propiedades como se muestra anteriormente (siendo, en este caso, una especie de redefinición de métodos).

Rubén
  • 10,857
  • 6
  • 35
  • 79
2

¿Esto quiere decir que los datos heredan propiedades y métodos?

Primero, tienes que olvidarte por un momento de la POO clásica; me refiero por clásica a la POO que implementan lenguajes como C#, Java o PHP. Segundo, debes saber que hay más modelos de POO, uno de ellos, es el modelo prototipado y es el que implementa JavaScript.

Prototipo

¿Qué es un prototipo? Imagina que tienes una fábrica de automóviles, la cual fabrica distintos familias de modelos. Cada familia, tiene un modelo del cual derivan todos, este, es el prototipo de dicha familia.

Un prototipo es simplemente un objeto especial que describe el comportamiento de algo y que sirve como base para la creación de unos nuevos. En JavaScript, todo objeto tiene un prototipo y hereda uno de la función de primer nivel, Object(Object.prototype), la cual es la madre de todo tipo de dato en JavaScript:

const emptyObject = {};
console.info(Object.getPrototypeOf(emptyObject));
// o mediante __proto__
console.info(emptyObject.__proto__);
// Algunos métodos que se hereda de Object.prototype
// toString
// toLocaleSting
// hasOwnProperty
// Ver más en: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
console.info(emptyObject.toString);
console.info(emptyObject.toLocaleString);
console.info(emptyObject.hasOwnProperty);

En el código anterior nos damos cuenta que todo objeto, hereda, implícitamente las propiedades y métodos de Object.prototype. Si vienes de Java, esto aplica igual, ya que en Java, todo objeto hereda de Object. El siguiente ejempo refuerza lo anterior, utilizando el primitivo de Number:

const money = 123.50;
console.info(money.toString);
console.info(money.toLocaleString);
console.info(money.hasOwnProperty);

¿Existen metodos heredables y metodos generales?

No solo métodos, si no también propiedades como ya vimos en el apartado anterior. Pero además de heredar propiedades y métodos de Object.prototype, un objeto también puede tener métodos propios como es obvio.

¿Cómo darse cuenta si un método es propio o heredado? La respuesta es simple: buscando como propiedad en el objeto mismo o en su prototipo:

// false porque toString pertenece a Object.prototype
console.info(String.hasOwnProperty('toString'));

// false porque freeze está en el prototipo de Object
console.info(String.prototype.hasOwnProperty('freeze'));

// true porque fromCharCode sí es propio de String
console.info(String.hasOwnProperty('fromCharCode'));

// false porque endsWith no es una propiedad directa, si no que está en el prototipo de String
console.info(String.hasOwnProperty('endsWith'));
// true porque sí está en su prototipo
console.info(String.prototype.hasOwnProperty('endsWith'));

Un caso curioso es, por ejemplo, que si miras si un primitivo tiene el método de su tipo de dato, te dirá que no lo tiene pero sin embargo, lo puede usar:

const jsRocks = 'claro!';

// false
console.log(jsRocks.hasOwnProperty('codePointAt'));
// 97
console.log(jsRocks.codePointAt(2));

Esto sucede porque implícitamente, cuando se llama a un método sobre un objeto/dato, JavaScript buscará el método dentro del objeto (como propiedad directa), y seguirá buscando en la cadena de prototipos. Si lo encuentra lo ejecuta, si no, verás el clásico error "xxx.yyy is not a function".

gugadev
  • 18,776
  • 1
  • 24
  • 49
  • Recién estoy revisando [Todo en JavaScript es un objeto ¿cierto o falso?](https://es.stackoverflow.com/q/85853/65) y estoy revisitando esa respuesta que un principio me pareció correcta, sin embargo, hoy día encuentro una incongruencias. Por favor no lo tomes a mal. Se trata de la mención de que "Object(Object.prototype), la cual es la madre de todo tipo de dato en JavaScript", sin embargo y siendo estrictos, esto no es cierto para el caso de los datos primitivos, por otro lado no está claro la distinción de los primitivos y los objetos que existen para cada uno de estos. – Rubén Jul 10 '17 at 03:52
  • En relación a esto hay una pregunta sobre esto [Valores primitivos booleanos versus Objeto booleano](https://es.stackoverflow.com/q/36993/65) ¿la has visto? – Rubén Jul 10 '17 at 03:53
  • 1
    @Rubén no tengo por que tomarmelo a mal, al contrario, es bueno que comentarios como el tuyo intenten aclarar un punto ;). Plus, tienes razón, me refería a objetos propiamente dichos, no primitivos porque es implícito la naturaleza de los primitivos; fue un error de typo. Respecto a tu pregunta sobre los primitivos; un primitivo ni siquiera tiene propiedades; por ende no es un objeto según demanda la POO. Sin embargo, un primitivo tiene un correspondiente *wrapper* que sí es un objeto, tiene un prototipo y por medio de éste podemos acceder a diferentes propiedades y métodos. – gugadev Jul 10 '17 at 14:43
  • 1
    La pregunta interesante es: ¿cómo es posible que, si un primitivo no tiene propiedades entonces podamos hacer algo como `'Rubén'.toUpperCase()'`? La respuesta a esto es curiosa: en cuanto el intérprete descubre que se intenta llamar a una propiedad/método sobre un primitivo, inmediatamente **reemplaza** el mismo en un objeto, el cual es su wrapper. Luego de terminada la llamada, lo descarta. – gugadev Jul 10 '17 at 14:43
  • 1
    Gracias por la aclaración. He estado leyendo un poco sobre esto de los wrapper y me surgen la curiosidad acerca de ejemplo para los otros primitivos... seguiré leyendo. – Rubén Jul 10 '17 at 14:48