151-3895-5886

Mozilla的JavaScript引擎__noSuchMethod__()办法

2019年09月18日 维尼网络

JavaScript中有很多内部属性和办法,在大多数情况下,只有JavaScript引擎才可以访问,但不论什么都是有特例的,在这里就是指Mozilla的JavaScript引擎,包括SpiderMonkey和Rhino,都提供了若干接口来访问这些内部属性,如果加以合理利用的话,不仅可以让JavaScript更加健壮,还可以开发出一些有意思的功能,比如本文介绍的__noSuchMethod__()办法就是其中之一。

著作权声明

本文译自 Nicholas C. Zakas 于2009年2月17日在个人网站上发表的《Mozilla JavaScript extension: __noSuchMethod__》。原文是唯一的正式版,本文是经过原作者(Nicholas C. Zakas)授权的简体中文翻译版(Simplified Chinese Translation)。译者(明达)在翻译的准确性上做了大量的努力,并承诺译文的内容完全忠于原文,但可能还是包含疏漏和不妥之处,欢迎大家指正。译注的内容是非正式的,仅代表译者个人观点。

以下是对原文的翻译:

和其它浏览器相比,Mozilla的JavaScript引擎总会有一些与众不同的亮点。SpiderMonkey和他的好搭档Rhino(用 Java实现的JavaScript引擎)都提供了很多扩展特性,可以帮助我们开发更加健壮的JavaScript应用。其中之一就是本地对象的__noSuchMethod__()办法。在大多数JavaScript引擎中,访问一个不存在的办法时都只会简单的抛出错误,而在Mozilla的引擎中,这只是默认行为,我们可以通过覆盖某个对象的__noSuchMethod__()方来来重新定义这个行为。当这个对象试图调用一个不存在的办法时,就会触发该对象的__noSuchMethod__()办法。

当__noSuchMethod__()办法被调用时,JavaScript引擎会传入两个参数,一个是调用办法的名称,一个是参数数组,对应于要传递给调用办法的所有参数,注意这个参数数组需要是一个Array对象,而不是arguments对象,而且就算没有参数,也要传递一个空数组,下面举一个简单的例子加以说明:

// 注意,下面的代码只有在使用SpiderMonkey或者Rhino的浏览器中才会被正确解析
var person = {
    name: "Nicholas",
    __noSuchMethod__: function(name, args){
        alert("Method called '" + name +
            "' executed with arguments [" + args + "]");
    }
}
//"Method called 'sayName' executed with arguments []"
person.sayName();      
//"Method called 'phone' executed with arguments [Mike]"
person.phone("Mike");

这段代码定义了一个person对象,并重写了该对象的__noSuchMethod__()办法。当调用person对象的sayName()办法和phone()办法时,由于这两个办法都不存在,所以__noSuchMethod__()办法会被自动调用,这样我们就避免了一个错误的显示,并且可以做出相应的处理。在上面这个例子中,我们所做的处理就是直接将办法的名称和传递的参数直接显示出来。

但话说回来,在运行时才发现未定义办法的情况,是不该出现在正常的开发实践中的,那简直就是自取烦恼。对于通常的情况来说,这个办法似乎没有什么作用,但他确实为我们提供了一个可能性,来创建一些有趣的动态工具,比如说建立一个可以输出有效XHTML文档的对象:

function HTMLWriter(){
    this._work = [];
}
HTMLWriter.prototype = {
    escape: function (text){
        return text.replace(/[><"&]/g, function(c){
            switch(c){
                case ">": return ">";
                case "<": return "<";
                case "/"": return """;
                case "&": return "&";
            }
        });
    },
    startTag: function(tagName, attributes){
        this._work.push("<" + tagName);
        if (attributes){
            var name, value;
            for (name in attributes){
                if (attributes.hasOwnProperty(name)){
                    value = this.escape(attributes[name]);
                    this._work.push(" " + name + "=http://www.dnzs.com.cn/"" + value + "/"");
                }
            }
        }
        this._work.push(">");
    },
    text: function(text){
        this._work.push(this.escape(text));
    },
    endTag: function(tagName){
        this._work.push("");
    },
    toString: function(){
        return this._work.join("");
    }
};
var writer = new HTMLWriter();
writer.startTag("html");
writer.startTag("head");
writer.startTag("title");
writer.text("Example & Test");
writer.endTag("title");
writer.endTag("head");
writer.startTag("body", { style: "background-color: red" });
writer.text("Hello world!");
writer.endTag("body");
writer.endTag("html");
alert(writer);

阅读更多内容
上一篇JavaScript+CSS制作的网站导航菜单
下一篇Javascript绘制分析曲线图

声明:本页内容由郑州维尼网络收集编辑所得,所有资料仅供用户参考,转载请保留此链接http://www.zzwn.cn/cms/3404.html

本文标签: javascript Mozilla 引擎 noSuchMe

 

相关资讯 Related Info
相关分类 News Classification
解决方案 Solutions
相关热点 Hot spot
javascript实现网页跳转的办法 javascript实现网页跳转的办法
  1. 我们的承诺
  2. 我们的实力
  3. 我们的未来
郑州做网站咨询电话 建站咨询

151-3895-5886

网站备案安全放心网站

地址:郑州市上街区和昌都汇广场 / 电话:151-3895-5886
客服QQ: 7758021 / 邮箱:admin@zzwn.cn
Copyright © 2010-2019 郑州融科网络 版权所有