ajg, If string can be converted to an index, it's treated as index and goes through IndexedPropertyGetter and friends.
yours, anton. On Thu, Apr 14, 2011 at 9:14 AM, ajg <[email protected]> wrote: > thanks for suggestion. > I did try to copy the methods manually but then some other methods > fail, for example toString() on the object does not work since it > checks that the object really is an array. > It prints out "TypeError: Array.prototype.toString is not generic" > Copying the prototype seems to work better, both the forEach() and > toString() seem to work, but I have to do more tests. > > I am hitting another problem that is not related, I may post another > question about it. > Basically I create a JS object from an ObjectTemplate that is backed > by a C++ object, and that object has a single key that is number-like > (e.g. "0" or "10"). > Then I have proper NamedPropertyGet and NamedPropertyEnumerator, but > v8 just seems to act as if key does not exist. > If I use the exact same object but add a letter in front of the number > (e.g. "a0") then code works fine. > It seems that v8 has some specific behavior if the keys are numbers, > maybe it is confused and think it's an array. > I started going through v8 code but if anyone knows.. > > On Apr 8, 3:42 am, Anton Muhin <[email protected]> wrote: >> You were hit by some implementation details of v8. >> >> This kind of customization ideally should be performed in JS. Or you >> can just putArray.prototype as a prototype for your objects. >> >> yours, >> anton. >> >> On Fri, Apr 8, 2011 at 12:14 AM, ajg <[email protected]> wrote: >> > I tried using the code below, but the "names"arrayis empty (I guess >> > because these properties are marked as "DontEnum") >> >> > Local<v8::Object> proto = >> > Local<v8::Object>::Cast(v8::Array::New(1)->GetPrototype()); >> > internalFieldArrays = >> > Persistent<ObjectTemplate>::New(ObjectTemplate::New()); >> > Local<v8::Array> names = proto->GetPropertyNames(); >> > for ( unsigned int i=0; i<names->Length(); i++ ) { >> > v8::Local<v8::String> name = >> > names->Get(i)->ToString(); >> > internalFieldArrays->Set(name, >> > proto->Get(name)); >> > } >> >> > It seems that the only way to get the forEach property is: >> > Local<v8::Value> val4 = arr->Get(v8::String::New("forEach")); >> > Hence I would have to manually copy each property by name, there is no >> > better way? >> >> > On Apr 7, 11:57 am, Anton Muhin <[email protected]> wrote: >> >> Good day, ajg, >> >> >> I don't think you can (and should be able to) create v8::Arraywith >> >> ObjectTemplate. >> >> >> However, it's easy to installArrayfunctions to any kind of >> >> object---ECMAScriptarrayfunctions were intentionally designed to >> >> work with generic objects---all you need is to add a length property. >> >> Simple test would be to do something like [].forEach.call(yourobject, >> >> args). To use convenient syntax yourobject.forEach just add >> >>Array.prototype.forEach and other functions to prototype of your >> >> object (see PrototypTemplate) or an object directly (1st option is >> >> preferable). >> >> >> hth and yours, >> >> anton. >> >> >> On Thu, Apr 7, 2011 at 9:59 PM, ajg <[email protected]> wrote: >> >> > I already have a working ObjectTemplate that enables js code to access >> >> > C++ objects in a lazy fashion, using the NamedPropertyHandler. >> >> > Now I also need to create v8:Arraythat is backed by a C++ object >> >> > using the IndexedPropertyHandler. >> >> > But it seems that ObjectTemplate can only create a v8::Object, not a >> >> > v8::Array. >> >> > Doing an indexed access on v8::Object works fine but then the built-in >> >> > functions like "forEach" are not available. >> >> > Basically I need to either: >> >> > - create a v8::Arraywith IndexedPropertyHandlers >> >> > - create a v8::Object with IndexedPropertyHandlers and transfer the >> >> > builtin methods to it, or somehow convert it to a v8::Array. >> >> > Note that on C++ side it is not a native typearray, so I cannot use >> >> > the v8::Object::SetIndexedPropertiesToExternalArrayData >> >> > Any suggestion? >> >> > thanks >> >> >> > -- >> >> > v8-users mailing list >> >> > [email protected] >> >> >http://groups.google.com/group/v8-users >> >> > -- >> > v8-users mailing list >> > [email protected] >> >http://groups.google.com/group/v8-users >> >> > > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
