0

我想獲得這樣的如何實現instanceof作爲接收字符串的函數?

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

的問題是,場也所需BASECONTROL,所以在這種情況下,現場是不確定的,並且我收到以下錯誤:

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

我可以解決這個問題下面requireJS做cumentation:

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

哦,加分使用ECMA標準功能(所以我會嘗試儘可能地避免__proto__ ...) – opensas 2013-02-24 00:24:21

+0

爲什麼你沒有範圍內的構造函數?那麼它的範圍是什麼? – Bergi 2013-02-24 01:12:04

+0

我正在使用requireJS,如果我需要構造函數,我會得到一個循環引用,所以我正在尋找一種方法來驗證參數的類型而不需要它。 – opensas 2013-02-24 06:10:52

回答

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 Design Patterns,第2章接口Google Books)中找到。

+0

鴨子打字技巧是一個很好的解決方法。 – opensas 2013-02-24 18:43:01

+0

錯誤:ReferenceError:分配中無效的左側 – 2013-07-23 13:26:07

+0

@AbdennourToumi:否。或者:在哪裏?你可能在某處出現錯字。請注意,第一個等號是嚴格的比較,第二個是正常比較,最後是一個任務。 – Bergi 2013-07-23 13:37:03

0

在你上面的auggestions,我寫了下面的短代碼,與相關例子:

<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> 
相關問題