On 12/25/10, fernando trasvina <trasv...@gmail.com> wrote:
>
> On Dec 24, 2010, at 8:44 PM, Garrett Smith wrote:
>
>> On 12/24/10, fernando trasvina <trasv...@gmail.com> wrote:
>>>
>>> On Dec 24, 2010, at 6:43 PM, Garrett Smith wrote:
>>>
>>>> On 12/24/10, Michael Haufe (TNO) <t...@thenewobjective.com> wrote:
>>>>> On Dec 24, 3:05 pm, Garrett Smith <dhtmlkitc...@gmail.com> wrote:
>>>>>
>>>>>> I rather have it one way or the other. e.g.
>>>>>>
>>>>>> makePoint(x, y);
>>>>>>
>>>>>> - OR -
>>>>>>
>>>>>> new Point(x, y);
>>>>>>
>>>>>> I just don't like seeing any extra if/else in the code. I also don't
>>>>>> want to handle the case where somebody might be relying on an anomaly
>>>>>> of calling the constructor as a function call.
>>>>>
>>>>> If defensive programming isn't necessary, of course. But since JS
>>>>> can't statically enforce such things it may be necessary to do so.
>>>>>
>>>> If a factory is used, then that's irrelevant. Toy example:
>>>>
>>>> function getAPoint(x, y) {
>>>>
>>>> }
>>>> The worst the client could do would be to use `new getAPoint`. That
>>>> would be a problem if the API expects `this` to be global object.
>>>>
>>>> Methods can be shared in scope, but the x and y properties can be
>>>> instance properties.
>>>>
>>>> function getAPoint(x, y) {
>>>> function distanceFromOrigin() {
>>>>   return Math.sqrt((this.x * this.x) + (this.y * this.y));
>>>> }
>>>> getAPoint = function(x, y) {
>>>>   return {
>>>>     x : x,
>>>>     y : y,
>>>>     distanceFromOrigin: distanceFromOrigin
>>>>   };
>>>> };
>>>> return getAPoint(x, y);
>>>> }
>>>> getAPoint(4, 0).distanceFromOrigin();
>>>
>>> I would say that coding this way should not be done unless there is an
>>> extreme requirement for it.
>>>>
>>>> The downside to that is `distanceFromOrigin` is hanging off the VO, so
>>>> it looks like a private static method, so what is `this`?
>>>>
>>>> It might be OK to "leak" a little implementation detail in this case:
>>>>
>>>> function getAPoint(x, y) {
>>>> function Point(x, y) {
>>>>   this.x = +x;
>>>>   this.y = +y;
>>>> }
>>>> Point.prototype = {
>>>>   distanceFromOrigin : function() {
>>>>     return Math.sqrt((this.x * this.x) + (this.y * this.y));
>>>>   }
>>>> };
>>>>
>>>> getAPoint = function(x, y) {
>>>>   return new Point(x, y);
>>>> };
>>>>
>>>> return getAPoint(x, y);
>>>> }
>>>
>>> this should be done this way. you should not be defining the constructor
>>> function every time you run your factory,
>>
>> You're making a statement about the code that is false. The example
>> uses a technique that is known as "function rewriting" or "russian
>> doll" or I've explained it with more elaboration below.
>>
>> this what is
>>> really doing is creating a new constructor function every time and
>>> building
>>> an instance for it completely useless because because
>>> then how would you do instanceof? never put this type of closures for
>>> factories unless really needed.
>>>
>>
>> Your conclusion follows your analysis, which unfortunately is
>> incorrect. Please see my explanation below.
>>
>>> var Point = function(){};
>>>
>>> var getAPoint = function(x,y){
>>>     return new Point(x,y);
>>> }
>>>
>> What's missing from that example?
>     are you making up a point of a rhetorical question in here? nothing is
> missing, you can run the code and get an instance of Point
>

The Point constructor doesn't really do anything. It looks like you
forgot something. And you obviously forgot a semicolon after
`getAPoint`.


> please run it and you will se that this is correct
>
> alert (getAPoint(1,2) instanceof Point);
>
> it is pointless to write the implementation of Point because it is not
> needed to probe that the resultant object is correct.
>

Yeah, pointless.

>>
>> Here is my explanation:
>>>>
>>>> The Point constructor is cached on the VO of the outer getAPoint.
>>>> Outer getAPoint identifier gets assigned to inner getAPoint identifier
>>>> but the scope chain of the inner getAPoint function has the Point
>>>> constructor and prototype.
>
> OMG lectures again?
>

Well, if you don't want to learn it, then you don't have to.

> just run your code

Be sure, I run my code before posting.

>
> function getAPoint(x, y) {
> function Point(x, y) {
>   this.x = +x;
>   this.y = +y;
> }
> Point.prototype = {
>   distanceFromOrigin : function() {
>     return Math.sqrt((this.x * this.x) + (this.y * this.y));
>   }
> };
>
> getAPoint = function(x, y) {
>   return new Point(x, y);
> };
>
> return getAPoint(x, y);
> }
>
I ran that.

I did not run the following, as it is not my code:
> console.log(getAPoint(1,2)) //Object { x=1, y=2}
> console.log(getAPoint(1,2) instanceof Point) //false
>

That's your code not mine. And it does not do what you said it does.
That code should result ReferenceError, as Point would not be resolved
there. Well, unless you added a separate Point constructor and got
yourself confused while typing into FB.

> please check that you so called function rewriting is accomplished by
> returning tthe execution of inner getPoint which results always in an
> instance of inner Point, which is useless for introspection.
>

The inner Point? Again there's only one Point constructor in the example.

[snip massive overquote with signatures]
-- 
Garrett

-- 
To view archived discussions from the original JSMentors Mailman list: 
http://www.mail-archive.com/jsmentors@jsmentors.com/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/jsmentors@googlegroups.com/

To unsubscribe from this group, send email to
jsmentors+unsubscr...@googlegroups.com

Reply via email to