我想知道以下情况是否可行。我正在尝试编写一个对象工厂,它将构造不同类型的对象。我想弄清楚的是,如果有可能在java脚本中将类型设置为除函数或对象之外的其他东西吗?类似于在C#中,Car的类实例是一种类型的Car,即使基类型是对象。希望我能清楚地解释这一点。解释它的最佳方式如下所示:
var object = function(){
switch(id){
case 1:
$_objInstance = new Car();
break;
case 2:
$_objInstance = new Animal();
break;
return $_objInstance;
}
function Car(){
this.Name = "GM";
}
document.write(object instanceof Car);
or
typof(
object) == Car //is this possible?
提前致谢!快乐的编码:)
答案 0 :(得分:1)
不,你不能。但是:我想弄清楚的是,如果在java脚本中可以将类型设置为函数或对象以外的其他类型吗?
JavaScript确实有一个instanceof
运算符,您可以使用它来测试一个实例,看它是否可能是由给定的构造函数构造的:
if (obj instanceof Car) {
// ...
}
Function#name
在野外仍然不可靠(因为JavaScript引擎还没有可靠地设置它),你可以在构造函数上明确设置它:
Car.name = "Car";
...然后使用obj.constructor.name
查找构造函数的名称。这依赖于正确继承constructor
属性的对象,如果你没有搞乱函数prototype
属性上的默认对象,它将会这样做。
几年前我wrote a blog post关于typeof
,instanceof
,Object.prototype.toString
,以及您可以用来确定某些内容的各种其他方式,尽管我没有选择该选项只是设置你自己的名字。
以下是使用.constructor.name
:
function Car() {
}
Car.name = "Car";
function Animal() {
}
Animal.name = "Animal";
snippet.log("Randomly constructing 10 Cars or Animals:");
for (var n = 0; n < 10; ++n) {
var x = Math.random() < 0.5 ? new Car() : new Animal();
snippet.log("We got: " + x.constructor.name);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
当我说上文时
这依赖于正确继承
constructor
属性的对象,如果你没有搞乱函数prototype
属性上的默认对象,它将会这样做。
让我举个例子来搞砸它,让你知道要注意什么。你经常看到人们这样做:
// PROBLEMATIC: Wipes out the `constructor` property
function Car() {
}
Car.prototype = {
drive: function() {
}
// ...
};
也就是说,不是扩充 Car.prototype
最初得到的对象,而是替换它。我更喜欢扩充(例如,不要替换整个对象,只是添加属性),出于各种原因,但是如果你做替换它你可以做确保你给新的正确的constructor
:
// Keeps `constructor` correct
function Car() {
}
Car.prototype = {
constructor: Car,
drive: function() {
}
// ...
};