0

私はこのようなものを手に入れたいです

var isChild = isInstanceOf( var1, 'Constructor')

それは同等でなければなりません

var isChild = (var1 instanceof Constructor)

問題は、関数 Constructor をスコープで使用できないため、文字列を渡したいだけです。

を取得して比較するには、プロトタイプチェーンをたどる必要があると思いconstructor.toString()ますが、それを達成する方法がよくわかりません。

--

主により良い解決策を見つけたので、コンテキストを少し完成させます

2 つの関数コンストラクター間で循環参照があり、参照しようとすると 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プロパティを使用します。


ただし、これは確実に機能しません。プロパティはIEでサポートされている必要はnameなく、無名関数でも機能しません(これらは一般的です)。したがって、(モジュール性などの理由で)チェックするコンストラクターがない場合は、ダックタイピングを試してください。http://zidan.me/javascript-interfaces/もご覧ください。Interface実装は、本Pro JavaScript Design Patterns、Chapter 2 InterfacesGoogle Books)にあります。

于 2013-02-24T01:16:13.417 に答える