Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add apply #23

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions implementations/apply.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
The apply() method calls a function with a given this value, and arguments provided as an array (or an array-like object).


MDN Link: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply


Parameters

* otherThis
The value of this provided for the call to func.
* arr
Optional. An array-like object, specifying the arguments with which func should be called, or null or undefined if no arguments should be provided to the function.

Return value
The result of calling the function with the specified this value and arguments.
*/

Function.prototype.myApply = function (otherThis, arr) {
otherThis = otherThis || global;
var uniqueID = "00" + Math.random();
while (otherThis.hasOwnProperty(uniqueID)) {
uniqueID = "00" + Math.random();
}
otherThis[uniqueID] = this;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you use this line of code?
otherThis.__proto__.uniqueID = this;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TheSTL Why do we need to use this instead of otherThis[uniqueID] = this; . Can you elaborate ?

Copy link
Member

@TheSTL TheSTL Oct 12, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By doing this we are making a pair of key-value in otherThis where key is some random id and value is function on which apply is called. When we call the function of otherThis (otherThis.uniqueID(...arr)) then in function this value will be otherThis.
@ashishdutta007

Copy link

@ashishdutta007 ashishdutta007 Oct 13, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TheSTL The same is being done by @tamirisapbonicenha in line no 30 & 35
result = otherThis[uniqueID]();.
The only benefit what I can see from using otherThis.__proto__.uniqueID = this; in place of
otherThis[uniqueID] = this; is that there is no chance of collision of the unique id in the prototype object.
Moreover is __proto__ is a browser implementation , instead of a built in js implementation.
Is there something I'm missing ?

Copy link
Member

@TheSTL TheSTL Oct 13, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually problem is the uniqueId property is printed .You can check snapshot #23 (review)
@ashishdutta007

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @ashishdutta007 for telling me Moreover is __proto__ is a browser implementation , instead of a built in js implementation.. I'm testing things on browser .


var args = [];
var result = null;
if (!arr) {
result = otherThis[uniqueID]();
} else {
for (let i = 1, len = arr.length; i < len; i++) {
args.push("arr[" + i + "]");
}
result = eval("otherThis[uniqueID](" + args + ")");
Comment on lines +32 to +35
Copy link
Member

@TheSTL TheSTL Oct 8, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And for 32-35 can you use this line of code?
result = otherThis.uniqueID(...arr);

}

delete otherThis[uniqueID];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete otherThis.__proto__.uniqueID

return result;
};