您可以在Javascript中将对象类型设置为自定义名称而不是函数

时间:2016-01-27 17:29:08

标签: javascript oop

我想知道以下情况是否可行。我正在尝试编写一个对象工厂,它将构造不同类型的对象。我想弄清楚的是,如果有可能在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?

提前致谢!快乐的编码:)

1 个答案:

答案 0 :(得分:1)

  

我想弄清楚的是,如果在java脚本中可以将类型设置为函数或对象以外的其他类型吗?

不,你不能。但是:

  • JavaScript确实有一个instanceof运算符,您可以使用它来测试一个实例,看它是否可能是由给定的构造函数构造的:

    if (obj instanceof Car) {
        // ...
    }
    
  • Function#name在野外仍然不可靠(因为JavaScript引擎还没有可靠地设置它),你可以在构造函数上明确设置它:

    Car.name = "Car";
    

    ...然后使用obj.constructor.name查找构造函数的名称。这依赖于正确继承constructor属性的对象,如果你没有搞乱函数prototype属性上的默认对象,它将会这样做。

几年前我wrote a blog post关于typeofinstanceofObject.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() {
    }
    // ...
};