关于javascript中的参数的另一个问题。我正在阅读关于javascript框架Prototype的教程,并通过以下文本,我将在下面引用:
“如果你有自己的DOM方法,你想添加到Prototype的那些,没问题!Prototype也为此提供了一种机制。假设你有一堆封装在一个对象中的函数,只是将对象传递给Element.addMethods():
var MyUtils = {
truncate: function(element, length){
element = $(element);
return element.update(element.innerHTML.truncate(length));
},
updateAndMark: function(element, html){
return $(element).update(html).addClassName('updated');
}
}
Element.addMethods(MyUtils);
// now you can:
$('explanation').truncate(100);
这里唯一需要注意的是确保这些方法的第一个参数是元素本身。在您的方法中,您还可以在最后返回元素以允许可链接性(或者,如示例中所实践的,任何本身返回元素的方法)。“
除了我似乎有问题理解的一件事之外,一切似乎都很简单。它说你需要确保这些方法的第一个参数是元素本身。这是函数中的情况,但是当你调用函数时,你只提供1个参数?例如:
$('explanation').truncate(100);
这里只有一个参数发送到函数即100,但函数签名如下:
truncate: function(element, length){
那么元素来自哪里?并且逻辑是你必须确保第一个参数是元素本身,但是当你调用函数时你不提供它吗?
答案 0 :(得分:3)
Prototype提供两种方法:
对象本身的方法,例如:
Element.toggleClassName('selector', 'something');
通过原型:
$('selector').toggleClassName('something');
答案 1 :(得分:1)
Javascript函数可以测试他们的参数,并根据传递的内容决定做什么。 jQuery以此闻名,在很多库中都很常见。它允许一个命名函数执行许多不同(但相关)的操作,并且通常允许可以省略可选参数或默认参数的简写符号。您通常可以传递一个,两个或三个参数,函数中的代码将检查存在哪些参数,在某些情况下,还可以查看决定如何处理它们的参数类型。
当函数执行此操作时,您必须仔细阅读其文档以查看哪些参数是必需的,哪些是可选的以及可以传递的顺序。
如果函数可选地接受三个参数并且所有三个都是不同类型,则函数可以检查每个传递参数的类型并以任何顺序接受它们。它可以分辨出哪种类型。我个人认为这不是很好的编程风格,但它是可能的。更有可能的是,它允许您省略一些不需要的参数,并且该功能将在某些事情丢失时调整其行为,或者为该值设置默认值。
在你的truncate的具体例子中,我必须看到该函数的文档页面,以解释当没有元素传递时它的作用与何时传递。
这是一个字符串截断函数的组成示例,可以使用多种不同的方式:
var str = "This is a long string that I want to be truncated to something shorter";
str.truncate(10); // truncate to max length of 10
str.truncate("string", "end"); // truncate after the first occurrence of "string"
str.truncate(/\bbe\b/, "begin"); // truncate before the first occurrence of a regular expression
str.truncate("string", 10); // truncate 10 chars after the first occurrence of "string"
这个函数的大纲看起来像这样:
string.prototype.truncate = function(lookFor, pos, cnt) {
if (lookFor == undefined) {
return(this); // no parameters passed, nothing to do
}
if (typeof lookFor == "Number") {
// truncate to a certain length
} else if (typeof lookFor == "String") {
// look for a plain string
} else if (lookFor.exec) {
// look for a regular expression
} else {
return(this); // nothing to do
}
}