On Jun 19, 4:04 am, Ariel Flesler wrote:
> On 18 jun, 17:45, meppum wrote:
> }).call(this.foo2); ---> }).call(this);

While that answer would be superficially effective (in the sense of
resulting in code that would behave as specified) it is a stupidly
inefficient approach, and so not something that should be suggested as
a correction to the original code.

You have proposed changing the - foo2Function - to:-

function foo2Function() {
    (function() {
        this.foo = "hi back";
    }).call(this);
}

- but if the - this - that is the argument to the call method resolves
as a reference to the correct object then the whole thing can be
replaced with the considerably simpler and more efferent:-

function foo2Function() {
     this.foo = "hi back";
}

More efficient, because it avoids the creation of a function object
each time the - foo2Function - is called, along with the call to -
call -.

<snip>
>>         <script type="text/javascript">
>>                 function myFunction() {
>>                     this.foo = "hi";
>>                     this.foo2 = foo2Function;

If a function is going to be used as a constructor (with the - new -
keyword) then assigning constant values to properties of the this
object within the constructors is less efficient and more unnatural
(in javascript terms) than assigning those values to the object
referred to by the function objects - prototype - property.

>>                 }
>
>>                 function foo2Function() {
>>                     (function() {
>>                         this.foo = "hi back";
>>                     }).call(this.foo2);
>>                 }

So the above would be better as:-

function myFunction(){
}
myFunction.prototype.foo = "hi";
myFunction.prototype.foo2 = function(){
    this.foo = "hi back";
};

>>                 function test() {
>>                     var obj = new myFunction();
>
>>                     alert(obj.foo);
>
>>                     obj.foo2();
>
>>                     alert(obj.foo);
>>                 }
>>         </script>

Reply via email to