And it can, since the symbol is just a secret stored in a closure and there are other sorts of secrets. Aside from the "Math.random() + {enumerable: false}" suggestion found elsewhere, you can reproduce the precise[0] semantics of your example using something like:
// Please do not actually write code like this
var Person = (function() {
var names = [];
function Person(name) {
this.key = names.length;
names[this.key] = name;
}
Person.prototype.sameName = function(other) {
return names[other.key] === names[this.key];
};
return Person;
})();
Which is the ES3 generated by this CoffeeScript: class Person
names = []
constructor: (name)->
@key = names.length
names[@key] = name
sameName: (other)->
names[other.key] is names[@key]
Of course these implementations do something dramatically different behind the scenes, and I emphatically don't think people should follow this example, but the interface is the same. Edit: Except that I left `.key` as an editable property, which is problematic. We'll leave that bit as an exercise, though.Whether `names[this.key]` is as "nice" to work with as `this[nameKey]` is, uh, left up to the reader; personally, count me in the camp that doing either of those things is nuttypants compared to `this._name`.
[0]: Assuming that `otherPerson` in your constructor is a typo, of course ;P