Сначала нам нужно исправить то, как вы строите свой класс, поскольку вы попадаете в некоторые ловушки JS и делаете действительно странные вещи:
function Point2D(x, y){
//Our constructor/initialization function
//when run, the 'this object will have
//Point2D.prototype as its prototype
this.x = x;
this.y = y;
//Don't return a value here! Doing so overrides
//the default "return this" that we actually want.
}
//You can put things in the Point2D prototype in order to have them
//be shared by all Point2D objects. Normally you want the methods to be shared.
Point2D.prototype.getX = function(){
return this.x;
};
//Note that there is nothing magical about the "prototype" property.
//It is just where the `new` syntax expects the prototype it will use to be.
//The actual magic property is __proto__ (don't depend on it though
// __proto__ is browser specific and unsafe/evil)
//We now can create points!
var p = new Point2D(17.0, 42.0);
p.getX();
Теперь мы можем рассмотреть вопрос о получении имен типов. Лучшая практика, по которой вам не хватает, это не проверять тип в первую очередь . С точки зрения ОО не должно иметь значения, как реализован объект (класс ts), а как он себя ведет и каков его интерфейс (открытые методы и свойства). Кроме того, с точки зрения Javascript, имена типов - это хак второго класса, которые не очень хорошо подходят для прототипной схемы ОО, которая фактически используется.
Поскольку существует множество причин, по которым вы можете пытаться проверить имя типа, существует много разных "лучших" решений. Некоторые, о которых я мог подумать:
Если все, о чем вы говорите, это «реализует ли этот объект конкретный точечный интерфейс», то вы можете выполнить проверку объектов напрямую:
function isPoint(p){
//check if p has all the methods I expect a point to have:
//(note that functions are truthy in a boolean context)
return (p.getX && p.getY);
}
Если вы используете имена типов для диспетчеризации, попробуйте вместо этого использовать метод. Это естественный путь ОО.
function speak(obj){
//fake pseudo-syntax:
if(obj is of type Cat){ console.log("meow"); }
if(obj is of type Dog){ console.log("woof"); }
}
становится
Cat.prototype.speak = function(){ console.log("meow"); };
Dog.prototype.speak = function(){ console.log("woof"); };
Если вам действительно нужен какой-то тег, вы можете сделать его явно, как уже указывалось в некоторых других ответах:
Point2D.prototype.pointType = "2D";
Преимущества здесь в том, что у вас может быть несколько классов с одним и тем же «типом», если вам нужно, и вам не нужно беспокоиться о сложных хитрых instanceof
или typeof
угловых случаях.