Javascript literal object, reference to it

I have an example code:

var foo = { self: this, init: function(){ self.doStuff(); }, doStuff: function(){ alert('doing stuff'); } } foo.init(); 

Why does the self confirmation not work?

Thanks!

+6
source share
3 answers

In response to a Qeuntin answer, you will use the following to achieve what you are looking for

 var foo = { self: false, init: function(){ self = this self.doStuff(); }, doStuff: function(){ alert('doing stuff'); }, } 

EDIT: since it has been pointed out that although this solves the OP problem (i.e. it works), it is not entirely accurate how you should do it. So, here is the viewing area.

 function A() { //Semi-private / hidden var var pVar = "I'm a private, err hidden, variable", //fn (technically a var) pFn = function(){}, //empty var, placholder for hidden fn privatePlaceholderFn; //Instance-time... public fn this.instancePublicFn = function() { console.log("--- instace public ---"); //Print hidden var to cosole console.log(pVar); //Call hidden fn instancePrivateFn(); console.log("--->Setting private from instance public") //Set the hidden fn setPrivate(); console.log("--- / instance public ---"); } //Pass fn to private method. this.setPrivFromOutside = function(fn) { setPrivateFromPrivateYetOutside(fn); } //Set the hidden fn this.iPFnPlaceholderSetter = function(fn) { privatePlaceholderFn = fn; } //Call the semi-private / hidden fn this.callPrivate = function() { privatePlaceholderFn(); } //A misnomer, proves the scope exists. See "function setPrivate()" this.setPrivateFromInstance = function() { //Prove scope exists console.log(privatePlaceholderFn); console.log("Private From instance - gets inside scope"); } //Set hidden fn from private method function setPrivate() { privatePlaceholderFn = function() { //Show scope exists console.log(pVar); } } //Set the hidden fn from hidden method function setPrivateFromPrivateYetOutside(fn) { //fn scope won't resolve to inside privatePlaceholderFn = fn; } //Private / hidden messager function instancePrivateFn() { //Just loggin' something console.log("Instance Private method"); } } //Add an object method to the prototype A.prototype.protoPuFn = function(){ console.log("---> Private var from object literal method"); //console.log(pVar) } //... a = new A(); //Add object literal fn a.objFn = function() { console.log("Object literal defined public fn - Gets outside scope"); //console.log(pVar); } //Set private / hidden placeholder fn a.iPFnPlaceholderSetter(function() { console.log("Hidden fn, passed through instance public - gets outside scope"); //console.log(pVar); }); //Attempt to read hidden var console.log(a.pVar); //Call object literal defined fn a.objFn(); //Call the hidden fn a.callPrivate(); //Call prototype added fn a.protoPuFn(); //Call instance added public fn a.instancePublicFn(); //Call private / hidden method (set a.callPrivate(); //Same as iPFnPlaceholderSetter except the param is passed to a hidden method, before seting. a.setPrivFromOutside(function() { console.log("-->Passed from outside, through public then private setters"); //console.log(pVar) }) //Call the hidden method a.callPrivate(); //Set hidden fn from instance public a.setPrivateFromInstance(); //Call the hidden method. a.callPrivate(); //Use evi(a)l fn to steal scope. a.evil("this.meth = function(){console.log(pVar)}"); //Call fn with stolen scope a.meth(); 
+3
source

Because at the time you declare the this literal object, this is not a reference to the object, but to any call context.

+8
source

The value of this determined by how the current function is called. It does not apply to the current object.

This will work:

 var foo = { init: function(){ this.doStuff(); }, doStuff: function(){ alert('doing stuff'); } }; foo.init(); 

Because when you call foo .init() , this becomes foo .

+6
source

Source: https://habr.com/ru/post/902867/


All Articles