0

我想得到这样的东西

var isChild = isInstanceOf( var1, 'Constructor')

那应该相当于

var isChild = (var1 instanceof Constructor)

问题是我在范围内没有可用的函数构造函数,所以我只想传递一个字符串。

我想我应该遍历原型链以获得constructor.toString()然后比较它,但我不太知道如何实现它。

--

稍微补一下上下文,主要是找到了更好的解决方案

我在两个函数构造函数之间有一个循环引用,当我尝试引用它时,RequireJS 一直返回 undefined。(在上述情况下,构造函数将是未定义的。)

我找到了这条信息:http ://requirejs.org/docs/api.html#circular

这是导致问题的代码:

//(in BaseControl.js)

define(['src/utils/models/Field'], 
  function(Field) {
[...]

  setField: function(field) {

    if (!field instanceof Field) throw new Error('field should be an instance of Field');
    [...]

问题是 Field 也需要 BaseControl,所以在这种情况下 Field 是未定义的,我收到以下错误:

Uncaught TypeError: Expecting a function in instanceof check, but got false 

我可以按照 requireJS 文档解决它:

define(['require', 'src/utils/models/Field'], 
  function(require, Field,) {
[...]

  setField: function(field) {

    if (!Field) Field = require('src/utils/models/Field');

    if (!field instanceof Field) throw new Error('field should be an instance of Field');
    [...]
4

2 回答 2

1

你可以试试

function isInstanceOf(obj, constrname) {
    do {
        if (Object.prototype.hasOwnProperty.call(obj, "constructor")
          && typeof obj.constructor === "function"
          && obj.constructor.name == constrname )
            return true;
    } while (obj = Object.getPrototypeOf(obj))
    return false;
}

…使用命名函数对象的非标准name属性


但是,这不会可靠地工作。既不需要nameIE 支持的属性,也不需要使用匿名函数(这些函数很常见)。因此,如果您没有要检查的构造函数(出于模块化或任何原因),您应该尝试Duck typing。也可以查看http://zidan.me/javascript-interfaces/。该Interface实现可以在Pro JavaScript Design Patterns , Chapter 2 Interfaces ( Google Books ) 一书中找到。

于 2013-02-24T01:16:13.417 回答
0

根据您上面的建议,我编写了以下短代码,并附有相关示例:

    <SCRIPT LANGUAGE="javascript" TYPE="text/javascript">
function _check_data_type( _obj, _datatype )
{
    if ( _obj == null || _obj == "undefined" ) return -1 ;
    var _constructor = _obj.constructor + "" ;
    return ( typeof _obj === _datatype.toLowerCase() ||
             ( _constructor.toLowerCase().indexOf( _datatype.toLowerCase() ) != -1 ) ) ? 1 : 0 ;
}

    var _str1 = new String( "woow" );
    var _str2 = "woow" ;
    var _pi = 3.14 ;

    function myobj()
    {
        this.contents = "The apple is on the table" ;
    }

    var _array = new Array( 1, 2, 3, 4 ) ; 
    var _myobj = new myobj();

    document.write( "Casting the string 'woow' via object assignment: " + " >> " + ( _check_data_type( _str1, "string" ) ? "It's string" : "Not a string" ) + "<br>" ) ;
    document.write( "Casting the string 'woow' via literal assignment: " + " >> " + ( _check_data_type( _str2, "string" ) ? "It's string" : "Not a string" ) + "<br>" ) ;
    document.write( "is PI a number? " + " >> " + ( _check_data_type( _pi, "number" ) ? "Yes, it is" : "No !" ) + "<br>" ) ;
    document.write( "Is this an object of mine ? " + " >> " + ( _check_data_type( _myobj, "myobj" ) ? "Yes, it's yours, see contents : '" + _myobj.contents + "'" : "No !" ) + "<br>" ) ;
    document.write( "Is this an array obj? " + " >> " + ( _check_data_type( _array, "array" ) ? "Yes, it's an array" : "No !" ) + "<br>" ) ;
    </SCRIPT>
于 2014-05-02T08:33:01.970 回答