Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!1.eu.feeder.erje.net!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: comp.lang.javascript Subject: Re: Differences between [[Class]] and constructor Date: Tue, 02 Jun 2015 23:05:48 +0200 Organization: PointedEars Software (PES) Lines: 47 Message-ID: <1568741.VfgIOpCQGZ@PointedEars.de> References: Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1433279312 31266 eJwFwYEBwCAIA7CXQCjVczqR/09YgiivyyxUYjDk0NZ7l07VQuRXbdsUfpqyJfUemQfIM/0DEN0QzA== (2 Jun 2015 21:08:32 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Tue, 2 Jun 2015 21:08:32 +0000 (UTC) User-Agent: KNode/4.14.2 X-User-ID: eJwFwQERADEIAzBL9KCFyRl78C/hE7qglyEquNw7YFl+hXAcEL7zTo8PTnbUa9FspJCqq+NmW7FnEd+gfjoOFQs= Cancel-Lock: sha1:veY00XSecUtrF+rFfFTctdAlnnM= X-NNTP-Posting-Host: eJwFwYERAEEEBLCWeCxfjln0X8IlYVAwHQGPi/utQoyzuC6FTEokrXVrPz/y2Ls+TT/vxQMhjhIg Xref: csiph.com comp.lang.javascript:27968 Andreas Bergmaier wrote: > Stefan Ram schrieb: >> I have observed that the class ([[Class]]) name and the >> constructor name of an object often is the same! > > This might be the case for plain objects with the native constructors. > It is not for almost every other object, like > > var p = new (function Person(){}); > className(p) // "object" No, with this code it would be a capital “O”. > p.constructor // Person > >> The first difference I found is: You can change the >> constructor name, but not the class name. > > Not exactly. You cannot change constructor names either, as the `.name` > property of functions is typically non-writable (if it exists at all, it > is non-standard, as opposed to [[Class]]). See > https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name > for more information. > > What you can arbitrarily change is the `.constructor` property of any > normal object, there are no limitiations here. Whereas “normal object” would be one whose prototype is not constructed using (an emulation of) Object.create(…), as I pointed out in an update of my today: With a conforming implementation of Object.create(), following WeatherWidget.prototype = Object.create(Widget.prototype, {constructor: {value: WeatherWidget}}); the “constructor” property of WeatherWidget instances is neither writable, nor enumerable or configurable. Of those, an emulation of Object.create() can only accomplish read-onlyness, see Function.prototype.extend() in JSX:object.js. -- PointedEars FAQ: | SVN: Twitter: @PointedEars2 | ES Matrix: Please do not cc me. / Bitte keine Kopien per E-Mail.