我创建了一个JavaScript对象,但如何确定该对象的类?
我想要类似于Java的. getclass()方法的东西。
我创建了一个JavaScript对象,但如何确定该对象的类?
我想要类似于Java的. getclass()方法的东西。
当前回答
问题似乎已经回答了,但OP想要访问和对象的类,就像我们在Java中所做的那样,选择的答案是不够的(imho)。
通过下面的解释,我们可以得到一个对象的类(实际上在javascript中称为prototype)。
var arr = new Array('red', 'green', 'blue');
var arr2 = new Array('white', 'black', 'orange');
你可以像这样添加属性:
Object.defineProperty(arr,'last', {
get: function(){
return this[this.length -1];
}
});
console.log(arr.last) // blue
但是.last属性将只对从Array原型实例化的'arr'对象可用。因此,为了使.last属性对所有从Array prototype实例化的对象可用,我们必须为Array prototype定义.last属性:
Object.defineProperty(Array.prototype,'last', {
get: function(){
return this[this.length -1];
}
});
console.log(arr.last) // blue
console.log(arr2.last) // orange
这里的问题是,你必须知道“arr”和“arr2”变量属于哪种对象类型(原型)!换句话说,如果您不知道'arr'对象的类类型(原型),那么您将无法为它们定义属性。在上面的例子中,我们知道arr是Array对象的实例,这就是为什么我们使用Array。prototype为Array定义一个属性。但如果我们不知道“arr”的类(原型)呢?
Object.defineProperty(arr.__proto__,'last2', {
get: function(){
return this[this.length -1];
}
});
console.log(arr.last) // blue
console.log(arr2.last) // orange
正如你所看到的,在不知道'arr'是一个数组的情况下,我们可以添加一个新属性,只需使用'arr.__proto__'引用'arr'的类即可。
我们访问了'arr'的原型,但不知道它是Array的实例,我认为这是OP要求的。
其他回答
还有另一种技术可以识别类 你可以像下面这样在实例中存储引用到你的类。
class MyClass {
static myStaticProperty = 'default';
constructor() {
this.__class__ = new.target;
this.showStaticProperty = function() {
console.log(this.__class__.myStaticProperty);
}
}
}
class MyChildClass extends MyClass {
static myStaticProperty = 'custom';
}
let myClass = new MyClass();
let child = new MyChildClass();
myClass.showStaticProperty(); // default
child.showStaticProperty(); // custom
myClass.__class__ === MyClass; // true
child.__class__ === MyClass; // false
child.__class__ === MyChildClass; // true
obj.constructor.name
是现代浏览器中的可靠方法。Function.name在ES6中被正式添加到标准中,使其成为一种标准兼容的方法,以字符串的形式获取JavaScript对象的“类”。如果用var obj = new MyClass()实例化对象,它将返回"MyClass"。
它将为数字返回“Number”,为数组返回“Array”,为函数返回“Function”等等。它通常会像预期的那样运行。唯一失败的情况是通过object创建的对象没有原型。Create (null),或者从匿名定义(未命名)函数实例化对象。
还要注意,如果您正在缩小代码,那么与硬编码的类型字符串进行比较是不安全的。例如,不是检查obj.constructor.name == "MyType",而是检查obj.constructor.name == MyType.name。或者只是比较构造函数本身,但这不能跨DOM边界工作,因为每个DOM上都有不同的构造函数实例,因此在它们的构造函数上进行对象比较是行不通的。
在javascript中,没有类,但我认为您需要构造函数名称和obj.constructor.toString()将告诉您需要什么。
你可以通过使用constructor属性获取创建对象的构造函数的引用:
function MyObject(){
}
var obj = new MyObject();
obj.constructor; // MyObject
如果你需要在运行时确认对象的类型,你可以使用instanceof操作符:
obj instanceof MyObject // true
如果你可以访问类Foo的实例(Foo = new Foo()),那么只有一种方法可以从实例中访问类:Foo。Javascript中的构造函数= Java中的foo.getClass()。
eval()是另一种方法,但由于eval()永远不被推荐,它适用于所有事情(类似于Java反射),所以不推荐使用这种方法。foo。构造函数= Foo