No es la configuración para una broma, realmente estoy preguntando.¿Cómo es que una cadena de Javascript no es un objeto?
Douglas Crockford is fond of saying que en el lenguaje javascript prototypal orientado a objetos no hay necesidad de new
.
Explica que new
se añadió simplemente para dar a las personas que vienen de (es decir, "clásicos") orientados a objetos lenguajes de programación basados en clases cierto nivel de comodidad:
JavaScript, We Hardly
new
YaJavaScript es una lenguaje prototípico, pero tiene un operador
new
que intenta hacer que se vea como un lenguaje clásico. Eso tiende a confundir a los programadores, lo que lleva a algunos patrones de programación problemáticos.Nunca necesita utilizar
new Object()
en JavaScript. Use el objeto literal{}
en su lugar.
Bueno, está bien:
new
mal{}
buena
Pero entonces comentarista Vítor De Araújo pointed out that the two are not the same. Se da un ejemplo que muestra que una string
no es como un object
:
Un objeto de cadena y un valor de cadena no son la misma cosa:
js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42
El valor de cadena no pueden tener propiedades nuevas. Lo mismo es válido para otros tipos.
¿Qué está pasando aquí que un string
no es un object
? ¿Estoy confundiendo javascript con algunos otros idiomas, donde todo es un objeto?
... y no estoy de acuerdo totalmente con Crockford: no es es necesario usar 'new Object' (ninguno es' new Array', use '[]' en su lugar), pero si quiere definir una nueva instancia de una clase (pre) definida, realmente debería usar el operador 'new', como en 'new Date()' o 'new SchrodingersCat()'. –
@Marcel Korpel: * "debería usar" *, o ** debe ** * usar *? ¿Hay alguna otra forma de construir un nuevo objeto a partir del prototipo de objeto 'Date'? –
Buena pregunta, en caso de 'Fecha': ** debe **. Si llama a 'Fecha' como una función simple, devuelve la fecha y la hora actuales como una cadena. También vea [Usando el constructor sin operador 'nuevo'] (http://stackoverflow.com/questions/1928342/using-constructor-without-operator-new) y [¿El nuevo operador de Javascript hace algo más que dificultar la vida?] (Http : //stackoverflow.com/questions/1744426/does-javascripts-new-operator-do-anything-but-make-life-difficult) –