Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: comp.lang.javascript Subject: Re: Object instance's local variable is not separate Date: Sat, 07 Jun 2014 21:03:17 +0200 Organization: PointedEars Software (PES) Lines: 154 Message-ID: <4155262.DTQR67hhvp@PointedEars.de> References: <12u13ppz1f252.63eqsi8uwd9r.dlg@40tude.net> <5180532.WuG82CC6N6@PointedEars.de> <4dy7dfnuv1vq$.1i9vecn58t2n8$.dlg@40tude.net> Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1402167817 15687 eJwVyskRwCAMBLCWWN8pxwa2/xKY6C3XQOy08DCns1J0MudrrbWtiS7KCMArOHXmT3r9gGO6HhxkEVo= (7 Jun 2014 19:03:37 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Sat, 7 Jun 2014 19:03:37 +0000 (UTC) User-Agent: KNode/4.12.4 X-User-ID: eJwNyskBwCAMA7CV6sTOMQ6FsP8Ird6SB2InQ0Fd3WuzypvpHSiJPDslbHv5DNeJ6kIh8HeSMKK9zzTHfOYDH2sT/Q== Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg== X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&. On Sat, 07 Jun 2014 13:48:14 +0200, Thomas 'PointedEars' Lahn wrote: >> JJ wrote: >> ^^^^^^^^^^^^^^^^ >> . Please fix. > > What are the options other than using my real email address? Your reasonable options are discussed in that document. I recommend to use the address of an aggressively-filtered, seldom-read (but *read*) mailbox for the From header field, and the address of a more often read mailbox for the Reply-To header field. That is what I do. >>> n1 = new Num(); >>> n2 = new Num(); >> >> After this constructor call, “val” in Num.prototype.value is bound to the >> local variable in the context of *that* call. > > So, does this means there's only one "val" variable in that context? There is only one “val” variable per execution context. However, the point here is that by overwriting the prototype’s property value in the constructor you are binding the identifier reference in the prototype method always to *that* variable, i. e. that of the execution context of the last constructor call. >>> 1) console.log(n1 instanceof Num); //true = ok >>> console.log(Object.getPrototypeOf(n1).constructor===Num); //true = ok >> >> It has to be >> >> function Num () >> { >> var val = 0; >> >> this.changeTo = function(n) { >> val = n; >> }; >> >> this.value = function() { >> return val; >> }; >> } > > What about the prototypal Number object, where: > > (new Number()).toFixed === Number.prototype.toFixed > > How to implement that? The expression evaluates to true because the left-hand side is resolved to Number.prototype.toFixed through the prototype chain. ("toFixed" in (new Number())) === true but (new Number()).hasOwnProperty("toFixed") === false (Besides, new Number(…) should be avoided.) As for exactly the same functionality as the built-in object, I do not think that is possible. A user-defined prototype method needs a publicly accessible property on the instance. You could only have a public prototype method calling a "privileged" instance method which accesses the context- local variable aka the "private property". The following comes close: "use strict"; Object.defineProperty(this, "Num", { configurable: true, /* not enumerable */ writable: true, value: function Num (value) { var has_args = (arguments.length > 0); if (!(this instanceof Num)) { if (has_args) { return +value; } return 0; } var _primitive_value = (has_args ? +value : 0); Object.defineProperty(this, "_getPrimitiveValue", { /* not configurable, not enumerable, not writable */ value: function () { return _primitive_value; } }); } }); Object.defineProperty(this.Num, "prototype", { /* not configurable, not enumerable, not writable */ value: (function (_global) { var prototype = new _global.Num(); Object.defineProperties(prototype, { /* … */ toFixed: { configurable: true, writable: true, value: function (precision) { var primitive_value = this._getPrimitiveValue(); /* achieve precision */ return primitive_value; } }, toString: { configurable: true, writable: true, value: function (radix) { return this._getPrimitiveValue().toString(radix); } }, valueOf: { configurable: true, writable: true, value: function () { return this._getPrimitiveValue(); } } }); return prototype; }(this)) }); See also . -- PointedEars FAQ: | SVN: Twitter: @PointedEars2 | ES Matrix: Please do not Cc: me. / Bitte keine Kopien per E-Mail.