2016-09-18 6 views
0

私はWindows Script Host VBScriptを使って遊んでいますが、VBScriptがJScriptのようなプロパティを追加/削除できるかどうか不思議です。例えばVBScriptはJScriptのようなオブジェクトにプロパティを追加できますか?

var global = this; 

var test = function() { 
    if ('greeting' in global) { 
     WScript.echo (
      'global has property named greeting with value: ' + 
      global.greeting + 
      '.' 
     ); 
    } else { 
     WScript.echo('global has no property named greeting.'); 
    } 
}; 

test(); 
global.greeting = 'Hello, World!'; 
test(); 
delete global.greeting; 
test(); 

このコードは、グローバルスコープを決定します(JScriptのは、Node.jsの中のブラウザでウィンドウやグローバルなどグローバルスコープへの最初のアクセスを持っていないので、私はそれを自分自身を見つける必要があります)。

test()関数は、グローバルオブジェクトに "greeting"という名前のキーがあるかどうかをチェックし、現在の状態を出力として報告します。

グローバルオブジェクトにグリーティングキーがないことを示す初期テストを行い、次にグリーティングプロパティを設定してからグリーティングキーがグローバルオブジェクトに追加されたことを示す2番目のテストを行います。この後、グリーティング・プロパティーが削除され、キーがグローバル・オブジェクトの一部ではないことを示す第3のテストが実行されます。

これはVBScriptで複製できますか?

私はVBScriptにこのような情報を保存するために使用できるオブジェクトがあることを知っていますが、VBScriptで既存のオブジェクトをフックしてそのようなプロパティを削除する方法があるかどうか、またはVBScriptにJScript {}Scripting.Dictionaryまたはクラス(プロパティは不変です)以外の構造体。

答えて

4

あなたの具体的な例としては、このようなものをエミュレートすることができます

Set global = CreateObject("Scripting.Dictionary") 

Sub test 
    If global.Exists("greeting") Then 
     WScript.Echo "global has property named greeting with value: " & _ 
      global("greeting") & "." 
    Else 
     WScript.Echo "global has no property named greeting." 
    End If 
End Sub 

test 
global("greeting") = "Hello, World!" 
test 
global.Remove("greeting") 
test 

が、一般的なパッチオブジェクト、あるいは定期的に継承して、VBScriptでサポートされていません。クラスを拡張するためにできる最善の方法は、自分のクラスでラップすることです。

Class MyClass 
    Private nested_ 

    Public Sub Class_Initialize 
     Set nested_ = CreateObject("Some.Other.Class") 
    End Sub 

    Public Function Foo(val)   'wrapped method 
     Foo = nested_.Foo(val) 
    End Sub 

    Public Function Bar(val)   'patched method 
     x = nested_.Bar(val) 
     Bar = x * 42 
    End Sub 
End Class 
+0

それは理にかなっている。 VBScriptはsimulaのようなオブジェクトモデルを使用し、JScriptはsmalltalkのようなオブジェクトモデルを使用します。 VBScriptオブジェクトは厳密なインターフェイスを持ち、プロトタイプはありません。 JScriptオブジェクトは辞書であり、JScriptは関数を動詞として扱わないため、自然にマップに追加することができますが、vbscriptの変数に関数/サブを代入するのは奇妙です(新しいVBでは代理人がいますが、 JScriptはコールバックとして渡す関数の入出力については気にしません)。 – Dmitry

+0

まともな説明。 – Lankymart

関連する問題