On Dec 26, 2010, at 4:12 AM, Dmitry A. Soshnikov wrote:

> On 26.12.2010 3:51, fernando trasvina wrote:
>> 
>> 
>> On Dec 25, 2010, at 1:51 PM, Dmitry A. Soshnikov wrote:
>> 
>>> On 25.12.2010 2:46, fernando trasvina wrote:
>>> 
>>> [...]
>>> 
>>>> What crockford is trying to point is that you should not think as the new 
>>>> operator as the classical use of new
>>>> you should think of it as the prototype pattern,
>>> 
>>> Yes, but actually, there is no a big difference between "classical new" and 
>>> "prototypal new" (if I can use such a naming).
>>> 
>>> In many languages, `new` is just a syntax construct to generate a new 
>>> object. Usually, not just an object, but the object of a some 
>>> classification. Again, absence or presence of the "class" concept in the 
>>> languages, does not affect the ability of the language to create and 
>>> classify objects.
>>> 
>>> What is a big difference in that how do you call the sugar for creation and 
>>> classification of your objects? Again, you may sugar it in a special syntax 
>>> construct and to name it "class". Or you may use the simplest form of the 
>>> generation -- just a function which creates and returns an object and sets 
>>> the classification tag (to be able distinguish somehow these object from 
>>> other with the similar properties).
>> 
>>     Actually when you run new ConstructorFunction() you get the function 
>> being executed
>>     When you run Object.create ObjectPrototype no function gets executed
>>     This is the main difference.
>>   
> 
> No, excuse me, you didn't understand the question (my fault seems). I meant 
> -- what is the difference between of using different sugars for exactly 
> classified programming. I.e. whether you use `class A ... end`, or `function 
> A ... end`? I.e. why do you think JS doesn't support classes? How do you 
> describe what "class" is at all (not in JS, but in general)?
> 
> And regarding unclassified programming with Object.create -- I see you 
> mention a some technical difference ("function is executed, function is not 
> executed"). Yes, this is fair. Though as I said (and think) that the main 
> difference is exactly ideological: in classified approach (i.e. a linear 
> chain of inheritance, ability to group objects by some classification tag, 
> make checks on this tag, etc) and unclassified (inheritance chain is 
> unclassified, but chaotic -- that is, "inherit from what I want", no 
> classification tag is needed).
> 
> And from this viewpoint, JS supports both approaches -- prototypal and 
> classical. Actually, what every (prototype-) delegation-based language does. 
> As I mentioned, with prototype-based language it's easy to program in 
> class-based paradigm if needed. But not a vice-versa. 

   Very clear explanation :). yes indeed everything you say is correct.
> 
>>   
>>      so when you "inherit" from an object you can obtain 2 different objects 
>> depending on what the Constructor function object does
>>> 
>>>> and this is not in conflict in any way with the Object.create method
>>>> 
>>>> Object.create is good for creating inheritance hierarchies
>>>> new is good for creating instances that need an initializer function in 
>>>> this case known as constructor function.
>>>> 
>>> 
>>> Again, the main difference of the classical and prototypal models in the 
>>> classified (classical) and unclassified (prototypal) concepts. And all the 
>>> other differences are not so essential. It's very easy choice (regardless 
>>> in which system you program):
>>> 
>>> 1. If you don't need to classify your object(s) (and the whole inheritance 
>>> hierarchic in case you nave more than one object in it) -- use unclassified 
>>> pattern (e.g. Object.create).
>>  I would say that this does not depends on your approach rather should be on 
>> what you need, do you need to initialize your new object or no?
> 
> Yes, also true. If you don't chain prototypes with using constructors, then a 
> single constructor is just an initialiser as you fairly notice. But what I 
> mean, is exactly building a hierarchic linear inheritance chain which is 
> specified. In contrast with unspecified approach with Object.create if 
> needed. Because if you talk about a single initialiser you may do it also for 
> Object.create just surrounding it in a function.
 yes agree completely :)
> 
>>> 
>>> Indeed, why do you need a class if you just want to use a complex object 
>>> with some properties and reuse the code (inherit) from another object? Of 
>>> course prototypal (unclassified) approach is the way.
>>> 
>>> 2. If you need classified objects -- use classified pattern. In ECMAScript 
>>> in the simplest way it's achieved via using a constructors (you may use 
>>> your own factory though).
>>> 
>>> Really, why do you should use unclassified approach if you decide that 
>>> these 100 objects are needed to be grouped (classified) by some sign? The 
>>> simplest example again, is a UI button component.
>>> 
>>> 
>>>> with the case of super you don't need it because you cannot (even when 
>>>> there are implementations that provide a way to do it) mutate the proto 
>>>> attribute of an object, so you always know what object you come from. so
>>>> 
>>>> A <- B (B inherits from A)  just call  A.methodName from B.methodName
>>>> A = function(){}
>>>> A.prototype.methodName = function(){
>>>>    //code
>>>> };
>>>> 
>>>> B = function(){}
>>>> B.prototype = new A(); // many techniques here to avoid constructor 
>>>> function being executed if you want to
>>>> B.prototype.constructor = B;
>>>> B.prototype.methodName = function(){
>>>>    //your code
>>>>        A.prototype.call(this[, ArgumentList]);
>>>> };
>>> 
>>> Having written several such classifications you may want to encapsulate 
>>> them in some sugar (a meta-constructor e.g. which creates other 
>>> constructors and sets correctly needed inheritance hierarchy regardless 
>>> concrete -- A, B, etc, names).
>> 
>>   this example was to point that there is no need to implement super when 
>> you know where you are "inheriting" from
> 
> But isn't it convenient not to couple with exact names of variables? In this 
> case you may just use a some standard name (e.g. `super` or `parent` or 
> whatever you want -- but standard) to refer a parent object in the hierarchy.

Yes you are correct, it does not look nice. the risk here is that someone 
replaces the value of A to another thing and give you another method that you 
were not expecting. (never happened to me but possible).
what i generally do when in risk of having this problem is set B.superClass = A 
at declaration time. Like ES uses the value not the variable, the later change 
to the value of A would not matter.

A = function(){};
A.prototype.methodName = function(){
    console.log('from A')
};
B = function(){};
B.superClass = A;
B.prototype = new A();
B.prototype.constructor = B;
B.prototype.methodName = function(){
    console.log('from B')
    this.constructor.superClass.prototype.methodName.call(this);
};

(new B()).methodName();

now this.constructor.superClass.... its longer but its consistent and i like it 
because it maintains very clearly the ES style and does not need to implement a 
new dsl.

> 
>> not for showing the way to inherit. besides this is the way ecma reccomends 
>> to inherint (decorate actually).
>> 
> 
> ECMA you mean examples in docs on the official site or the spec? If the 
> later, I didn't see this recommendation. Though, of course it's a wide-spread 
> known way.
Before ES5 this was the only way to achieve it. without a dsl tha internally 
all of them use some way to achieve the same. but i dont think we have a 
conflict with this matter i agree with you.
> 
> Dmitry.
> 
> -- 
> To view archived discussions from the original JSMentors Mailman list: 
> http://www.mail-archive.com/[email protected]/
>  
> To search via a non-Google archive, visit here: 
> http://www.mail-archive.com/[email protected]/
>  
> To unsubscribe from this group, send email to
> [email protected]

-- 
To view archived discussions from the original JSMentors Mailman list: 
http://www.mail-archive.com/[email protected]/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/[email protected]/

To unsubscribe from this group, send email to
[email protected]

Reply via email to