论证问题javascript

时间:2011-08-07 18:36:28

标签: javascript

关于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){

那么元素来自哪里?并且逻辑是你必须确保第一个参数是元素本身,但是当你调用函数时你不提供它吗?

2 个答案:

答案 0 :(得分:3)

Prototype提供两种方法:

  1. 对象本身的方法,例如:

    Element.toggleClassName('selector', 'something');

  2. 通过原型:

    $('selector').toggleClassName('something');

  3. IIRC,第二种方法只调用第一种方法,将选择的元素传递给它以及原始参数。这就是你的情况。

答案 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
    }
}