65.9K
CodeProject 正在变化。 阅读更多。
Home

JavaScript 中的有趣技巧

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (10投票s)

2010年10月3日

CPOL

3分钟阅读

viewsIcon

28756

介绍了 JavaScript 中五个有趣的技巧。

引言

在本文中,我想分享一些我所了解到的关于 JavaScript 的有趣的事情。

我们将看到这五个技巧:

  • 动态脚本加载
  • 无需 "new" 的实例化
  • 记忆化
  • 混合类
  • 通过克隆继承

#1 动态脚本加载

大多数时候,我们在页面渲染时最初加载所有脚本和其他资源。最初加载所有脚本会增加对服务器的 HTTP 请求,并大大减少用户看到页面所花费的时间。

例如,在使用 Google Maps 时,通常我们最初加载 Google Maps API 并显示地图。 如果您只想在用户需要时才显示地图,会是什么情况? 这是完成这项工作的脚本!

var api = "http://maps.google.com/maps/api/js?sensor=false&callback=initialize";

//The function that loads any external JavaScript dynamically
function loadScript(src) {
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = src;
  document.body.appendChild(script);
}


//Google maps api callback
function initialize() {
  var myLatlng = new google.maps.LatLng(-34.397, 150.644);
  var myOptions = {
    zoom: 8,
    center: myLatlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
}

<div id="map_canvas" style="width:500px; height:500px"></div>
<input type="button" value="Load Map" onclick="loadScript(api)" />

#2 无需 "new" 的实例化

在大多数语言(包括 JavaScript)中,实例化类通常由 "new" 运算符完成。 下面是在 JavaScript 中实例化类的典型方法

//Book class
function Book(isbn, author, title)
{
    this.isbn = isbn;
    this.author = author;
    this.title = title;
};

Book.prototype = {
    getIsbn: function(){
        return this.isbn;
    },
    getAuthor: function(){
        return this.author;
    },
    getTitle: function(){
        return this.title;
    },
};   

//instantiating using new
var book1 = new Book("1590597273", "John Resig", "Pro JavaScript Techniques");

通过修改上面的代码,我们可以像调用方法一样实例化 Book

var book1 = Book("1590597273", "John Resig", "Pro JavaScript Techniques");

这是代码

function Book(isbn, author, title)
{
    if(window == this)
        return new Book(isbn, author, title);
    this.isbn = isbn;
    this.author = author;
    this.title = title;
};

#3 记忆化

记忆化是一种优化方法的技术。 如果一种方法执行不需要重复执行的复杂处理,我们可以使用这种技术来动态更改其实现。

我们可以使用这个概念的最佳位置之一是创建 XmlHttpRequest 对象。 由于 AJAX 通信所需的对象因浏览器而异,甚至在不同版本的 IE 中也不同,因此每次我们都必须在创建对象之前嗅探浏览器。

通过记忆化,我们可以避免每次创建 XHR 对象时都进行浏览器检测。

createXhrObject: function() { // Factory method.
    var methods = [
    function() { return new XMLHttpRequest(); },
    function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
    function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
    ];
    for(var i = 0, len = methods.length; i < len; i++) {
        try {
            methods[i]();
        }
        catch(e) {
            continue;
        }
    // If we reach this point, method[i] worked.
    this.createXhrObject = methods[i]; // Memoize the method.
    return methods[i];    
    }
    // If we reach this point, none of the methods worked.
    throw new Error('SimpleHandler: Could not create an XHR object.');    
    }    
};

在上面的方法 createXhrObject 中,我们正在将实例化不同 AJAX 通信对象的不同方法存储在一个数组中。 然后,我们遍历数组,找到正确的方法并将其覆盖到 createXhrObject 中。

#4 混合类

继承是代码重用的一种好方法。 有时它不会有帮助! 例如,当您想使用完全不同的另一个类的方法时,我们无法从它继承。 在下面的示例中,我们有两个类 MixinBook

var Mixin = function() {};

Mixin.prototype = {
    serialize: function() {
        var output = [];
        for(key in this) {
            output.push(key + ': ' + this[key]);
        }
        return output.join(', ');
    }
};

//Book class
var Book = function(isbn, author, title)
{
    this.isbn = isbn;
    this.author = author;
    this.title = title;
};

Book.prototype = {
    getIsbn: function(){
        return this.isbn;
    },
    getAuthor: function(){
        return this.author;
    },
    getTitle: function(){
        return this.title;
    },
};

Mixin 类有一个方法 serialize,它将任何对象序列化为 JSON 字符串。 我们希望在 Book 类中使用 serialize 方法。 由于这两个类完全不同,我们无法从 Mixin 继承 Book。 别担心! 我们有一个不错的方法可以做到这一点。

function augment(receivingClass, givingClass) {
    for(methodName in givingClass.prototype) {
        if(!receivingClass.prototype[methodName]) {
            receivingClass.prototype[methodName] = 
            givingClass.prototype[methodName];
        }
    }
}

在上面的函数中,我们将 Mixin 类的所有方法复制到 Book 类。 通过使用这种技术,我们可以动态地将一个类的方法复制到完全不同的另一个类。

#5 克隆

在我见过的所有语言中,要创建对象,首先我们编写一个充当蓝图的类,然后我们实例化它。 在现实世界中,没有类,到处只有对象! 但是在 JavaScript 中,我们可以做一些我们在其他语言中无法想象的事情。 一个例子是我们可以直接创建对象。

下面是一个直接创建的 JavaScript 对象,没有类

var Tooltip = {
    showTip: function(el, text){
    },
    hideTip: function(){
    }
}

这探索了一种新的继承方式,称为原型继承或简称克隆。 在这里,首先我们创建一个对象,然后我们克隆它来创建具有相同或更多行为的新对象。 克隆中最重要的事情是 clone 函数本身,它克隆任何对象以创建另一个对象。

下面显示的是 clone 函数

function clone(object) {
    function F() {}
    F.prototype = object;
    return new F;
}

如果要创建上述 Tooltip 对象的克隆,请调用 clone(Tooltip)

如果您喜欢这些技巧,请不要忘记发表您的评论并投票 :)

**JavaScript 太棒了**

© . All rights reserved.