javascript中的静态方法

Static method in javascript?

本文关键字:静态方法 javascript      更新时间:2023-09-26

我想创建一个方法来验证数据,如使用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();
}

我已经参考了这个问题,但是它解决不了我的问题。

其中一个回答说:

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

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

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

要在javascript中扩展对象类型,可以扩展它的原型。您可能会讨论是否应该扩展基类型,但可以按以下方式完成:

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

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

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

您也可以在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)。

您可以通过添加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/