Evolution of a Prototypal Language User
blog.izs.me
blog.izs.me
Functional JavaScript is exciting and maleable to me, which is a breath of fresh air after (still) waiting so long for proper closures and anon functions in Java.
I think OO is getting a bad name due to people annoyed with Java, and functional is hip these days. But JavaScript is still an OO language.
Now if only JS supported immutability... I think I'll go learn some more Clojure. :)
Not even a semantic quibble - more like me poorly expressing my typical use of objects in JavaScript. I agree - objects in JS are full objects. I just tend to limit my use of them to the associative array realm...
> I think OO is getting a bad name due to people annoyed with Java, and functional is hip these days.
Agreed. I've written ~250K lines of Java (real-time, highly parallel and concurrent systems with hardware accelerated UI) in the past 3 years and love many things about the language and (especially) the JVM. FP is certainly in vogue right now - and for mostly good reasons. Hopefully as the pendulum swings we'll end up with a healthy middle-of-the-road approach which incorporates OO and FP. After all, closures are a poor man's object and objects are a poor man's closure.
> But JavaScript is still an OO language.
Most certainly! I was just highlighting the ability to (mis)use it as a functional language. Though as a functional language its lack of immutability is a double edged sword...
But I don't think it's the logical next step in the evolution described - it's rather what happens if you learn Lisp or Haskell or so and then revisit your javascript practises.
(In most cases you don't need to know if the DOM is class based or prototype-based though. It only matters if you use advances features like modifying the prototype of an element.)
Even if you work outside the browser, you still have to work with the basic types like arrays in a OO manner.
[1] http://www.iolanguage.com/scm/io/docs/IoGuide.html#Objects
I was hesitant to get into OO style in PHP and even Python, because it seemed to me to be over-applied. While classic inheritance and objects are useful, they're not the answer to everything, as most readers of HN probably agree. I'm glad to see more people embracing JS's prototypal nature.
For example the use of constructor functions and the "new" operator parallels classes in traditional OO. A perhaps more "prototypal" approach would be to define instances by using object literal syntax. But the object literal syntax does not allow one to define the prototype, so it is more limited than using constructors.
One of the proposed extensions in the abandoned ECMAScript 4 proposal was to allow prototype definition in object literals, like:
var obj = { x : 10, __proto__: protoobj };
This would make prototypal inheritance more natural, since you don't need the constructor as an intermediate step.ECMAScript 5 has the method Object.create which creates a new instance with the given prototype:
var obj = Object.create(protoobj, {x: 10});
But this is not yet widely supported, while "new" has been in the core since day one.Basically the JavaScript language has been slow to fully embrace its prototypal nature.