<div dir="ltr"><div class="gmail_quote"><div dir="ltr">Hi,<div><br></div><div>Sorry if I&#39;m writing to a wrong list. I&#39;m not a subscriber, just got a question I&#39;d like to clarify with JavaScriptCore gurus.</div>

<div><br></div><div>I&#39;m writing a JS binding for an existing class hierarchy and I&#39;m trying to set up a working inheritance model that would allow to extend classes exported from C++ in JavaScript.</div>
<div><br></div><div>I have a problem with shadowing a prototype&#39;s readonly property. Here&#39;s a minimal code sample:</div><div><br></div><div><div>JSStaticFunction sceneFuns[] = {</div><div>    { &quot;ctor&quot;, Scene_ctor, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },</div>


<div>    {0, 0, 0}</div><div>};</div><div><br></div><div>// I don&#39;t think nodeClass is relevant here, but I left it in to stay as close</div><div>// to the original code as possible</div><div>JSClassDefinition classdef = {</div>


<div>    .version = 0,</div><div>    .attributes = kJSClassAttributeNone,</div><div>    .className = &quot;Scene&quot;,</div><div>    .parentClass = nodeClass.jsclass,</div><div>    .staticValues = NULL,</div><div>    .staticFunctions = sceneFuns,</div>


<div>    .callAsConstructor = NULL,</div><div>};</div><div>JSClassRef jsclass = JSClassCreate(&amp;classdef);</div><div>JSObjectRef sceneClassObj = JSObjectMake(ctx, jsclass, NULL);</div><div><br></div><div>//</div><div>

// Then, inside a callback called from JavaScript as &quot;this.newPrototype()&quot;:</div>
<div>//</div><div><br></div>







<div>JSValueRef jsCallback(...)</div><div>{</div><div>    // The class is intentionally left NULL here. We don&#39;t want to create a separate JSClassRef</div><div>    // for every subclass created in JavaScript code</div>


<div>    JSObjectRef newClassObj = JSObjectMake(ctx, NULL, NULL);</div><div><br></div><div>    JSObjectSetPrototype(ctx, newClassObj, sceneClassObj);    // &lt;--- offending line</div><div>    return newClassObj;</div><div>


}</div><div><br></div><div>After executing JS code like this &quot;var proto = this.newPrototype(); proto.ctor = ...&quot;, the value of &quot;ctor&quot; does not change. If I comment out the offending line (marked in the code above), it becomes possible to override it.</div>


<div><br></div><div>This behaviour is surprising me. To my knowledge, an object&#39;s prototype is consulted when a property is not found on the object itself. Any new property is written to the object, never its prototype. So I was expecting to add the &quot;ctor&quot; property on &quot;newClassObj&quot; directly and shadow the prototype&#39;s read-only &quot;ctor&quot;, but it seems that either the property is set on the object&#39;s prototype (and the ReadOnly attribute makes it a no-op) or the ReadOnly attribute contaminates the object itself.</div>


<div><br></div><div>Perhaps I&#39;m misunderstanding the role of prototypes in JavaScriptCore. Could anyone help clear out the confusion for me?</div><div><br></div><div>Thanks!</div></div></div></div><div><br></div>-- <br>

Best regards<br>Alexei Sholik
</div>