检查参数是构造函数还是javascript中的实例

Checking if parameter is a contructor or an instance in javascript

本文关键字:javascript 实例 参数 构造函数 检查      更新时间:2023-09-26

我想做以下操作,如果传递的参数是构造函数,那么做new 'constructor',如果不是,只使用实例。我该怎么做?

这是我迄今为止所做的,但没有奏效。我认为我的代码有问题:

JS-

var showList = function (view, options) {
  // checking if view is a conctructor or not
  if (view instanceof view) {
    app.getRegion('main').show(view(options));
  } else {
    app.getRegion('main').show(new view(options));
  }                
}

因此上述函数可用作:

var listView = new ListView;
showList(listView);

或直线:

showList(new ListView);

我想你会想测试参数是对象还是函数:

if (typeof view === "function")

会告诉你这是一个函数(在你的上下文中是一个构造函数(

if (typeof view === "object")

会告诉你这是一个已经构建好的对象。


var showScreen = function (view, options) {
  // check if view is already an object
  if (typeof view === "object") {
    app.getRegion('main').show(view(options));
  } else {
    app.getRegion('main').show(new view(options));
  }                
}

在您的代码中,我感到困惑的一件事是,如果view已经是一个对象,那么为什么要执行view(options)。这对我来说没有意义。当view是一个函数时执行new view(options)是有意义的,但不是另一个选项,所以我认为也需要用这行代码来纠正一些问题。你可能是想在那个对象上调用一个方法吗?


仅供参考,如果有其他选择,我倾向于避免使用instanceof作为一般做法,因为instanceof可能存在跨帧代码问题,而typeof则没有这些问题。

var showScreen = function (view, options) {
  // checking if view is a conctructor or not
  if (view instanceof Function) {
    app.getRegion('main').show(new view(options));
  } else {
    app.getRegion('main').show(view(options));
  }                
}

也许不是最好的方法,但很好。

function A(){}
var a = new A();
a instanceof A // true
a instanceof Function // false
A instanceof Function // true

这对我来说就像是一种代码气味。我认为最好传递一个实例,而不是构造函数。

在这种情况下,你可以做:

showScreen(new ListView(options))

如果很难构建ListView,您应该想知道为什么是这样。

相关文章: