【问题标题】:How to implement instanceof as a function receiving a string?如何将 instanceof 实现为接收字符串的函数?
【发布时间】:2013-02-24 00:22:51
【问题描述】:

我想要这样的东西

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');
    [...]

【问题讨论】:

  • 哦,使用 ecma 标准函数的额外积分(所以我会尽量避免 proto 如果可能...)
  • 为什么你没有在范围内的构造函数?那么在什么范围内呢?
  • 我正在使用 requireJS,如果我需要构造函数,我会得到一个循环引用,所以我正在寻找一种方法来验证参数的类型而不需要它。
  • “循环引用”是什么意思?那会有什么问题呢?
  • 非常感谢您的关注,Bergi。我又看了一遍循环引用问题并解决了它。我更新了问题。

标签: javascript inheritance prototypejs requirejs circular-dependency


【解决方案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 property


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

【讨论】:

  • ERROR : ReferenceError: Invalid left-hand side in assignment
  • @AbdennourToumi:没有。或者:在哪里?你可能在某个地方有错字。请注意,第一个等号是严格比较,第二个是普通比较,最后一个是赋值。
【解决方案2】:

在你上面的建议下,我写了以下短代码,并附有相关示例:

    <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>

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2021-10-12
    • 1970-01-01
    • 2022-12-04
    • 2017-02-04
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多