javascript中的静态方法
本文关键字:静态方法 javascript | 更新日期: 2023-09-27 18:14:55
我想创建一个方法来验证数据,如使用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/