如何定义扩展方法并将其作为实例和静态方法调用
How to define extension method and call it as instance and static method?
是的,我知道我使用的术语根本不适用,或者它们适用于OOP语言的方式。
当我在 C# 中定义扩展方法时,我可以将其调用为实例方法 foo.call(bar)
或 Foo.call(foo,bar)
。我为Array
equals(secondArray,comparer)
定义了一个"扩展"方法,用于检查元素的相等性。我现在称之为myArray1.equals(myArray2)
.
但是,我也想称它为Array.equals(myArray1,myArray2)
。
如何使JS-way成为可能?
用一个例子来详细说明 SLaks 的答案:您可以提供一个"静态"方法,然后提供一个实例方法,将实例显式传递给静态方法。
var Obj = function(){
var _this = this;
this.x = 5;
this.equals = function(other){
return Obj.equals(_this, other);
}
}
Obj.equals = function(obj1, obj2){
return obj1.x == obj2.x;
}
obj1 = new Obj();
obj2 = new Obj();
console.log(obj1.equals(obj2));
console.log(Obj.equals(obj1, obj2));
控制台输出:
true
true
你需要创建两个单独的方法;一个在原型上,一个在函数上。
其中一个可以简单地调用另一个。
与 OozeMaster 的答案类似,您也可以以更"OO"的方式编写它(但仍然必须显式声明"静态"和成员方法):
var Operation = (function () {
function Operation(firstOperand) {
this.firstOperand = firstOperand;
}
Operation.prototype.add = function (other) {
console.log(this.firstOperand + other);
};
Operation.add = function (first, second) {
console.log(first + second);
};
return Operation;
})();
Operation.add(1, 2); // prints 3
var op = new Operation(3);
op.add(4); // prints 7
PS:这是Typescript在编写静态方法时生成的那种代码。如果你想写JS是一种OOP时尚,你可能想看看打字稿:http://www.typescriptlang.org/
相关文章:
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- 在Javascript中对类的每个实例调用一个方法
- 如何用javascript调用函数,然后在滚动事件中调用该函数的特定实例
- 从实例方法调用实例方法
- 概念验证模型控制器调用正确的实例
- 调用函数和创建函数实例之间的Javascript差异
- 向模板实例变量传递调用方法调用的结果时出现异常
- 如何理解“当类实例化时,JavaScript静态方法也是不可调用的”
- 如果多次调用同一函数,如何停止该函数的先前实例
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- 调用Class.prototype=new MyClass()是否确保每次都重新实例化超类
- 调用Javascript中实例的函数
- angular.injector在每次调用时返回新的服务实例
- 调用的每个实例的唯一随机数
- 如何使对象可以作为实例和函数调用
- 如何为同一 jquery 对话框的不同实例调用不同的操作
- 如何为对象的所有实例调用Objects函数
- 从对象实例调用函数不起作用
- 在JavaScript中使用Array对象对数组内部的实例调用任意方法
- 如何在不指定模型名称的情况下从该模型的实例调用静态Backbone.Model函数