@Jake:
No mate, seriously, it's problematic and you're missing it.
Good design won't solve this. You can't just make sure by design that
one level down will always bring you a different method when just
calling Object.getPrototypeOf.

@Alexander:
First, __defineGetter__ & const aren't standard, so I rather not use
them (while ES5 is standard but not fully supported there's still a
difference).
Second, the idea of looping through the object on every super call to
get the identifier occurred to me and I ignored it from obvious
performance reasons.
Third, hard-coding of getting the property from 2 levels down is just
a bad idea.

Thanks,
~Y


On Oct 27, 12:25 am, "Fyodorov "bga" Alexander"
<bga.em...@gmail.com> wrote:
> ydaniv:
>
>
>
>
>
>
>
>
>
> > @Jake:
> > Yes, I understood exactly why you wanted it configurable, it makes
> > good sense.
>
> > As for the reason we need something more then just
> > Object.getPrototypeOf():
> > I wished it could get down to that and we could simply use this, but,
> > I'll give you a very common use case where this fails:
>
> > var instance = {
> >   __proto__: {
> >     method: function () { alert('a'); },
> >     __proto__: {
> >       method: function () { alert('super a'); }
> >     }
> >   }
> > }
>
> > "instance" is an instance of some class that has a method "method" and
> > it inherits another class that has a method by the same name.
> > If you call Object.getPrototypeOf() on "instance" and ask for the
> > method "method" you'll get the same method. Bummer!
> > Say you had this method call its super inside it:
>
> > method: function () { alert('a'); return
> > Object.getPrototypeOf(this).method(); },
>
> > You'll crash the browser. Uber bummer!
> > So, we need something a bit more comprehensive than that.
>
> > As for your pd.make, yes, it's pretty much the same as Create.
> > Create also lets you cache the resulted object in a function that will
> > generate the same instance with every call, if you find it necessary.
> > Like define once and construct multiple times.
>
> > @Alexander:
> > You're right, usually you wouldn't call an overridden property from a
> > different one.
> > The thing is, for now, this looks like the smallest, safest, most
> > simple and least obtrusive way of getting a property.
> > Besides naming a function and getting it from arguments.callee.caller,
> > is there another way you see of getting that property?
>
> > Thanks a lot guys!
> > ~Y
>
> > On Oct 25, 11:35 am, "Fyodorov &quot;bga&quot; Alexander"
> > <bga.em...@gmail.com> wrote:
> > > ydaniv:
>
> > > > Thanks guys for the input!
>
> > > > @Jake:
> > > > It's evil to extend Object.prototype with an enumerable property.
> > > > here "_prototype_" is non-configurable because the logic here depends
> > > > on it. If you choose to use this then you'd want it to be non-
> > > > configurable.
> > > > But perhaps you're right and I could add "configurable: true", seems
> > > > like a good idea.
>
> > > > The "_asDescriptor" function is private and quite straight-forward.
> > > > The use of the letters e, p &r is a physical joke, and I didn't think
> > > > that following a single-line function would be too hard to follow.
> > > > Anyhow, I guess I'll change those to something more meaningful.
>
> > > > I'm sorry that you see the supr function as magic, cause actually it
> > > > follows the straight forward logic of getting an overridden property
> > > > in a prototype chain:
> > > > You find the object in the chain that actually defines this property
> > > > and then get this property again from its parent.
> > > > Since JS don't protect you from possible errors you need to go through
> > > > some hoops.
>
> > > > What are Object.make & Object.createSimple?
> > > > And yes, Create is very thin and light, that was the objective here.
>
> > > > @Alexander:
> > > > As I mentioned in the docs, if you name each method you're using supr
> > > > inside and not in strict mode then you can loose the "name" param.
>
> > > > Personally I don't like Resig's this._super because I find it very
> > > > obtrusive, it bloats your code, and frankly it uses magic like using
> > > > regex on the function.toString().
>
> > > > If you consider using a function's name inside it as breaking the DRY
> > > > principle then I guess that's your opinion. In python, you call a
> > > > super function like this:
> > > > class C(B):
> > > >     def method(self, arg):
> > > >         super(C, self).method(arg)
>
> > > > You could say I took some inspiration from that.
> > > > Besides that, putting a name of a different property allows you to
> > > > call a different overridden property, which is not RY at all.
>
> > > > Thanks!
> > > > ~Y
>
> > > > On Oct 24, 1:01 pm, "Fyodorov &quot;bga&quot; Alexander"
> > > > <bga.em...@gmail.com> wrote:
> > > > > ydaniv:
>
> > > > > > Hi,
>
> > > > > > I saw some discussions about OO & inheritance in JS so thought I 
> > > > > > might
> > > > > > share a small Gist I've contrived:
>
> > > > > >https://gist.github.com/1074335
>
> > > > > > It's ES5 only and implements a simple wrap for the Object.create
> > > > > > mechanism and a "super" property getter in a more unobtrusive way.
>
> > > > > > It's OS and will appreciate any feedback.
>
> > > > > > Thanks,
> > > > > > ~Y
>
> > > > > this._super() is better then your method because you force me
> > > > > duplicate method name, its not DRY
>
> > > ok, its flexible but if you design/decomposition require call some
> > > random method from super classes, not exactly what you overwrite - its
> > > mean that you have bad design or i dont know real use cases
>
> Object.prototype.__defineGetter__('_super', function(){
>   const _caller = arguments.callee.caller
>   const callerName = _caller.jbName || (_caller.jbName = (function(){
>     for(var k in this)
>       if(this[k] == _caller)
>         return  k
>   }.bind(this))())
>   return  Object.getPrototypeOf(Object.getPrototypeOf(this))
> [callerName]
>
> })
>
> const A = function(){}
> A.prototype._say = function(){ return  '1' }
> const B = function(){}
> B.prototype = Object.create(A.prototype)
> B.prototype.constructor = B
> B.prototype._say = function(){ return  '2' + this._super() }
> _log((new B())._say()) // '21'

-- 
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