是的,我知道我使用的术语根本不适用于OOP语言。
当我在C#中定义扩展方法时,我可以将其称为实例方法foo.call(bar)
或Foo.call(foo,bar)
。我为Array
equals(secondArray,comparer)
定义了一个“扩展”方法,用于检查元素的相等性。我现在称之为myArray1.equals(myArray2)
。
但我想将其称为Array.equals(myArray1,myArray2)
。
如何使JS-way成为可能?
答案 0 :(得分:1)
您需要制作两种不同的方法;一个在原型上,一个在功能上。
其中一人可以简单地打电话给另一人。
答案 1 :(得分:1)
详细说明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
答案 2 :(得分:1)
与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/