【问题标题】:Static method in javascript?javascript中的静态方法?
【发布时间】:2015-09-29 09:47:41
【问题描述】:

我想创建一种方法来使用 javascript 来验证 C# 语法等数据。我的 C# 代码是这样的:

public static class Validate
{
     public static bool IsValid(this string modelState)
     {
          return !String.IsNullOrEmpty(modelState) ? true : false;
     }
}

bool Method()
{
     string modelState = "My model";
     return modelState.IsValid();
}

在javascript中,我想将代码转换为:

var IsValid = function (modelState) {
     return $.trim(modelState).length > 0 ? true : false;
}

var method = function () {
     var modelState = "My model";
     // how to:
     // return modelState.IsValid();
}

我引用了this question,但它并没有解决我的问题。

其中一个回答说:

function Foo() {};
Foo.talk = function() { alert('I am talking.'); };
Foo.talk();

Foo 是一个对象,但在我的示例中,modelState 是一个字符串。

有没有办法在 javascript 中做到这一点?

【问题讨论】:

  • 您在 C# 中所说的不仅仅是静态方法,而是扩展方法。是的,这在 JavaScript 中是可能的。看看我发现的其他 SO 帖子。 stackoverflow.com/questions/9354298/…
  • @vnikhil 感谢您的搜索。

标签: javascript c#


【解决方案1】:

要在 javascript 中扩展对象类型,您可以扩展其原型。是否应该扩展基本类型可能会引起讨论,但可以按如下方式进行:

String.prototype.IsValid = function () {
     return $.trim(this).length > 0 ? true : false;
}


var method = function () {
     var modelState = "My model";
     // how to:
     return modelState.IsValid();
}

【讨论】:

    【解决方案2】:

    您的 C# 方法在概念上不是静态方法,尽管它实际上是一个。这是一个扩展方法。这意味着它会显示在字符串的所有instances 中(根据您在编辑源代码时看到的内容),就好像它是一个实例方法一样。

    由于语言的原型性质,您也可以在 JavaScript 中执行扩展方法:您将它们添加到原型中,在本例中为 String.prototype

    一般来说,如果你要扩展像String 这样的内置对象的原型,最好使用Object.defineProperty (ES5+),这样你创建的属性是不可枚举的:

    Object.defineProperty(String.prototype, "isValid", {
        value: function() {
            // Refer to the string using `this`
        }
    });
    

    这比仅仅通过分配来做更可取:

    String.prototype.isValid = function() {
        // Refer to the string using `this`
    };
    

    ...因为后者创建了一个可枚举的属性。

    如果您的代码要与其他代码混合(例如,如果它是库的一部分),请注意扩展内置原型,即使使用 Object.defineProperty,因为可能会发生名称冲突(例如,如果您的库加了isValid,别人的代码也加了isValid)。

    【讨论】:

    • 谢谢。你能给我解释一个子问题吗?在 C# 中,IsValid() 方法不能被覆盖,那么在 javascript 中呢?
    • @Kevin:可以是 JavaScript,是的。另一个区别是它实际上是 JavaScript 在运行时的字符串方法,而 C# 扩展方法纯粹是源代码错觉;实际编译的结果是静态方法调用。
    【解决方案3】:

    您可以通过添加IsValid 方法来扩展String.prototype,或者使用Object.defineProperty 仅扩展您本地的modelState

    var IsValid = function () {
         return this.trim().length > 0;  // removed jQuery dependence, IE9+
    }
    
    var method = function () {
         var modelState = new String("My model");
        Object.defineProperty( modelState, "IsValid", {
          get: function() { return IsValid; },
          enumerable: false,
          configurable: false
        });
        return modelState.IsValid()
    }
    

    http://jsfiddle.net/xs2trt4x/1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-30
      • 2011-12-03
      • 2012-06-21
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多