2016-09-18 54 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”的键,并将其当前状态报告为输出。

该代码执行初始测试以显示全局对象没有问候键,然后设置问候属性,然后执行第二个测试以显示问候键已添加到全局对象。之后,问候属性将被删除,并运行第三个测试以显示该密钥不再是全局对象的一部分。

这是可能在VBScript中复制吗?

我知道的VBScript具有可用于存储这些信息Scripting.Dictionary的对象,但我很好奇,如果有一种方法在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使用类似于小型对象的对象模型。 VBScript对象具有严格的接口并且没有原型。 JScript对象是字典,而JScript不会将函数视为动词,因此允许将它们自然地添加到映射中,而将函数/子分配给vbscript中的变量很奇怪(较新的VB有委托,但它们仍然非常严格键入,而JScript不关心函数的输入/输出以回调形式传递它)。 – Dmitry

+0

体面的解释。 – Lankymart

相关问题