Thanks for you thorough reply. I now understand that users have to use __proto__. Then I can rely on Signature's and Holder.
On Mar 18, 9:25 am, "Lasse R.H. Nielsen" <[email protected]> wrote: > No, you are correct, this is how prototype base property inheritance works > in JavaScript. However, prototype based inheritance is not the same as class > based inheritance, and it doesn't work the way inheritance works in, e.g., > Java. > > This is a JavaScript limitation. Inheritance in JavaScript is *property* > inheritance only. In class based inheritance, the inheriting class copies > all structure from the base class, wheras in prototype based inheritance the > inheriting object does not inherit any structure. It merely has a pointer to > another object, and property lookups (only!) follow this pointer. In all > other ways, the inheriting object is completely unrelated to the prototype. > Another way to say the same is that there are no classes in JavaScript (in > the sense of class based OO). Using constructors and prototypes can give > something that emulates classes, but it is not the same. > > You can have your functions on the Base prototype follow the prototype chain > of its "this" value to find an object that does implement the internal > structure it needs (if any exist). However, that object will be shared > between all instances of Derived, so the internal state will essentially be > "static" (in class-based terms). > > You might be able to use __proto__ to create a new Base object that inherits > Derived.prototype. E.g.: > > function Derived(args) { > var base = new Base(); > base.__proto__ = Derived.prototype; > return base; > } > Derived.prototype = {__proto__: Base.prototype, constructor: Derived }; // > [1] > > This ensures that > new Derived() instanceof Derived > new Derived() instanceof Base > Object.toString.call(new Derived) == "[object Base]" > and new Derived() has the necessary internal structure to support the > functions inherited from Base.prototype. > I.e., you need an object that is created using the ObjectTemplate you > created for Base for the associated functions > to work, so you must create one of those - which you can only do (from > JavaScript) using "new Base". > I think it should work (although I haven't actually checked yet). > > /L > [1] I prefer this to using Derived.prototype = new Base(). If emulating > class based inheritance, one should inherit from the class, not from an > instance, and the prototype represents the class (more than the constructor > function does). > > On Wed, Mar 17, 2010 at 17:12, Henrik Lindqvist > <[email protected]>wrote: > > > > > So I'am wrong that inheritance in JavaScript should be written: > > > function Base () {} > > function Derived () { > > Base.call(this); > > } > > Derived.prototype = new Base; > > Derived.prototype.constructor = Derived; > > > If so, how do I allow for natives to be inherited in v8? > > Is this a v8 or JavaScript limitation, or it just can't be done? > > > On Mar 17, 4:06 pm, "Lasse R.H. Nielsen" <[email protected]> wrote: > > > It won't work. > > > > In JavaScript, the prototype based inheritance is only property > > inheritance. > > > It does not extend to internal fields, like [[Class]] or internal values > > of, > > > e.g., Date, Number, String, or Boolean. > > > > You will have the exact same behavior if you try to inherit from, e.g., > > > Date. > > > The internal time value of a Date object belongs to the Date object only, > > it > > > is not inherited along the prototype chain. > > > That means that an object created using: > > > function Foo(){}; > > > Foo.prototype = new Date(); > > > var foo = new Foo; > > > does not function as a Date object - it's internal [[Class]] property > > isn't > > > "Date" and the Date specific functions will throw exceptions if called, > > > e.g.: > > > print(Object.prototype.toString.call(foo)); // prints [object Object], > > > not [object Date]. > > > print(foo.getTime()); // throws "TypeError: this is not a Date object." > > > > My guess at the problem of test 3 is that you are using the Base > > > constructor on an object that isn't created from the Base object > > > template. That means that the object doesn't have an internal field slot > > 0 > > > (or if it has, it's being used for something else), and you are just > > reading > > > and writing some other field of the object that is later overwritten > > again, > > > possibly by the foo property. The same happens in test 2, but the field > > just > > > happens not to be overwritten before it's read. > > > (I.e., the code is unsafe, since it assumes an internal field count, but > > > doesn't check that the object is created from the correct template). > > > > Best of luck. > > > /L > > > > 2010/3/17 Henrik Lindqvist <[email protected]> > > > > > "IIRC, this isn't the way to do it in v8" > > > > > I don't want to force users to do it the V8 way, I want them to do it > > > > the JavaScript way. > > > > > You write in your derived constructor: > > > > function MyPanel() { > > > > var argv = Array.prototype.slice.apply(arguments,[0]); > > > > this.prototype = this.__proto__ = new ncurses.NCPanel(argv); > > > > // ... > > > > return this; > > > > } > > > > > What is the property this.prototype? > > > > In the constructor, isn't "this" the instance, then it has no > > > > "prototype" property, that is on the constructor (function). > > > > I don't see why I should use the "__proto__" property to change the > > > > prototype chain after the instance was created, the prototype chain > > > > has already been specified. > > > > > On Mar 17, 11:38 am, Stephan Beal <[email protected]> wrote: > > > > > On Wed, Mar 17, 2010 at 2:44 AM, Henrik Lindqvist < > > > > > > [email protected]> wrote: > > > > > > "Derived2.prototype = new Base; \n" > > > > > > "Derived2.prototype.constructor = Derived2; \n" > > > > > > IIRC, this isn't the way to do it in v8. i remember going through > > similar > > > > > pain when i wrote my ncurses wrappper for v8, and now i find that i > > > > > documented it: > > > > > >http://code.google.com/p/v8-juice/wiki/PluginNCurses > > > > > > see the section called "Inheritance...", near the end of the table of > > > > > contents. > > > > > > i hope that helps. > > > > > > -- > > > > > ----- stephan bealhttp://wanderinghorse.net/home/stephan/ > > > > > -- > > > > v8-users mailing list > > > > [email protected] > > > >http://groups.google.com/group/v8-users > > > > -- > > > Lasse R.H. Nielsen > > > [email protected] > > > 'Faith without judgement merely degrades the spirit divine' > > > Google Denmark ApS - Frederiksborggade 20B, 1 sal - 1360 København K - > > > Denmark - CVR nr. 28 86 69 84 > > > -- > > v8-users mailing list > > [email protected] > >http://groups.google.com/group/v8-users > > -- > Lasse R.H. Nielsen > [email protected] > 'Faith without judgement merely degrades the spirit divine' > Google Denmark ApS - Frederiksborggade 20B, 1 sal - 1360 København K - > Denmark - CVR nr. 28 86 69 84 -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
