2016-10-31 5 views
2

タイプは、タイプとして渡されるコンストラクタ関数が必要です。JavaScriptでCoordinatesコンストラクタに直接アクセスするにはどうすればよいですか? Vueの中でチェック

props: { 
    coords: { 
    type: Coordinates, 
    required: true, 
    }, 
}, 

私はCoordinatesコンストラクタを見つける方法を考え出すことはできません。 Objectは何も継承していないため使用できません。何も許可しないことをお勧めします。

直接アクセスする方法についてMDNには何もありません:https://developer.mozilla.org/en-US/docs/Web/API/Coordinates

任意のアイデア?

編集:明確にするため、window.Coordinatesは未定義です。上記のコード例は動作しません。

+1

mdnはインターフェイスだと言っていますので、実装のプロトタイプを見つけようとしますか? –

+0

@潘俊杰:それは私が求めていたものです。私はそれを見つけることができません。 – callumacrae

答えて

2

Coordinatesではないウェブ開発者が使用するブラウザに公開されているもの。これは、ジオロケーション機能を実装するブラウザベンダーののW3Cジオスペックによって定義されたインターフェイスです。インタフェースは、特定のタイプのデータ構造がどのように見えるかを記述します。たとえば、次の例のcoords:次のコードでCoordinatesのリテラルを取得することができたとしても

navigator.geolocation.getCurrentPosition(function (pos) { 
    var coords = pos.coords 
    console.log(coords) 
}) 

。それは単なるオブジェクトです(それはプロトタイプであり、コンストラクタではありません)、あなたはほとんど何もできません。ここ

Object.getPrototypeOf(pos.coords) 

ので、2つのポイント:

  1. Coordinatesは、Web開発者のためではありません。
  2. Coordinatesも機能ではありません。

私が推測できる唯一の方法は、define your own validatorです。入力値が要件を満たしているかどうかを確認してください。あなたがあなた自身のCOORDSデータを手で作る場合

props: { 
    coords: { 
    validator: function (value) { 
     return value.toString() === '[object Coordinates]' 
    } 
    } 
} 

しかし、このバリデータが失敗することがあります。Coordinatesは特別toString()シンボルを持っているので、これは容易になるだろう。より一般的な方法は、ダックタイピングのようなものです。必要なプロパティが適切かどうかを確認するだけです。通常latitudelongitudeです。

+0

ああ、ありがとう!これは間違いなく最高の答えです:) – callumacrae

0

カスタムバリデータを使用して、値があなたのコンストラクタのintanceあるかどうかを確認する必要があります。

coords { 
    validator: function (value) { 
     return value instanceOf Coordinates; // Coordinates is a constructor in your case 
    } 
} 

HTML5 Geolocationドキュメントのを見てみましょう。

+0

私は 'instanceof'の使い方を知っています。 'window.Coordinates'は未定義です。 – callumacrae

+0

座標の独自のバリデータを作成したり、独自のクラス/プロトタイプを作成したりすることができます – Med

0

私もこの問題に取り組んでいます。 Vueのは、カスタムタイプを検証するためにinstanceofを使用するので、これは動作しますVUEコンポーネントに

props: { 
    coords: { 
    type: Coordinates 
    } 
} 

function Coordinates() {} 
Coordinates.prototype = Object.prototype 

:私のソリューションは、偽のコンストラクタを定義です。

+0

これは検証を使用する際のポイントを打ち消します: 'type:Object'を使うこともできます。 – callumacrae

+0

@callumacrae:Vueは 'Object.prototype.toString.call(propValue)=== '[object Object]''を使用して 'type:Object'を検証します。したがって、' type:Object'を使用してコンストラクタ –

関連する問題