如何在JavaScript中制作“点函数”

26

我正在尝试定义一个“点函数”,它没有参数,但在它之前有一个点(.)和一个字符串或数字,例如:

.toUpperCase()
.toLowerCase()
.indexOf()
.charAt()
.substring()

你需要使用2..toString而不是toString(2)

如何定义其中之一?


这并不被推荐。如果官方规范后来定义了一个同名但含义不同的函数,会怎样呢? - John Dvorak
1
然后,您必须将任何外部方法添加到对象的原型中。 - Voonic
它们必须是对象的方法,而不是所有东西都能以这种方式工作。 - helion3
2
无论如何,“2.toString()”都是无效的语法。您必须使用“2..toString()”。 - John Dvorak
你正在寻找原型。 - farmer1992
糟糕!那是个打错的字。我现在已经修正了。 - Oliver Ni
3个回答

30

定义“点函数”很容易。以下是如何在单个对象上定义它的方法。

var a = {}, or a = function() {}, or a = [], etc.

a.dotFunction = function() { return 'hi'; }

console.log(a.dotFunction());

如果您想在“类”的所有实例上定义它,请使用prototype

function someClass() {
}

someClass.prototype.dotFunction = function() { return 'hi'; };

console.log(new someClass().dotFunction());

你甚至可以在内置类型上这样做(某些库,比如 Prototype.js 可以这样做,但大多数不建议这样做)。

你甚至可以在内置类型上这样做(一些库进行了类似操作,例如Prototype.js,尽管大多数不建议这样做)。

Number.prototype.dotFunction = function() { return 'hi'; };

console.log((0).dotFunction()); 

19

我强烈建议不要尝试替换任何内置方法,但你可以随意定义自己喜欢的方法。

你可以通过将方法附加到NumberString类型的原型上来实现这一点:

Number.prototype.foo = function(n) { return this * n; };
String.prototype.bar = function(n) { return this.length * n; };

alert(4..foo(2));  // 8
alert("4".bar(2)); // 2

更多阅读


你不会包含任何原因,说明为什么向内置类型添加方法通常是不好的吗?另外,为什么在你的第一个alert()中有两个句点? - jfriend00
@jfriend00 我认为JS解析器需要两个点,否则仅使用一个前瞻就无法确定它是小数还是用于方法访问的点。 - alex

-1

我会尝试一下,因为没有人提到您已经可以在不必自己定义任何内容的情况下完成此操作。

需要注意的一件事是,如果您有一个数字,您必须在其后放置2个点,而如果您有一个返回数字或保存数字的变量的函数,则不需要:

1..toString()
 .indexOf("1")//<=returns number 0
 //even though a number is returned we only need one dot here
 .toString();//<="0"

var num = 1234;
num.toString()//<=one dot
  .indexOf("23");//<=1

你的例子已经可以工作了,但是由于indexOf如果给它一个有意义的参数会返回一个数字,而数字没有charAt方法。

"hello".toUpperCase()
  .toLowerCase()
  .indexOf("h")//<=returns a number 
               //number has no charAt method
  .toString()
  .charAt(0)
  .substring(0);//<="0"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接