前端攻城獅學習筆記五:繼承、原型、setInterval、數組去重


  這是淘寶UED招聘題中的兩道JavaScript題目。

題目一要求

  小賢是一條可愛的小狗(Dog),它的叫聲很好聽(wow),每次看到主人的時候就會乖乖叫一聲(yelp)。從這段描述可以得到以下對象:

function Dog() {
       this.wow = function() {
               alert(’Wow’);
      }
       this.yelp = function() {
              this.wow();
       }
}

  小芒和小賢一樣,原來也是一條可愛的小狗,可是突然有一天瘋了(MadDog),一看到人就會每隔半秒叫一聲(wow)地不停叫喚(yelp)。請根據描述,按示例的形式用代碼來實現(提示關鍵字: 繼承,原型,setInterval)。

題目一分析

  沒什么好分析的,原型方式繼承,用setInterval進行循環。代碼如下:

function MadDog(){
}

MadDog.prototype=new Dog();

MadDog.prototype.yelp=function(){
    var self=this;
    setInterval(function(){
        self.wow();
    },500);
}

  這里要注意的是閉包的使用。

題目二要求

  請給Array本地對象增加一個原型方法,它的用途是刪除數組條目中重復的條目(可能有多個),返回值是一個被刪除的條目的數組。

題目二分析

  這道題考查的就是基本的算法了,最簡單也是最容易想到的就是用雙重循環進行判斷:

Array.prototype.distinct = function() {
    var ret = [];
    for (var i = 0, l = this.length; i < l - 1; i++) {
        for (var j = i + 1; j < l; j++) {
            if (this[i] == this[j]) {
                ret.push(this.splice(j, 1)[0]);
                l = this.length;
j--; } } }
return ret; };

  這種方法效率不高,另外想到的一種方案就是用空間換時間,就是循環一次,在循環過程中用一個臨時變量把不重復的存起來,然后判斷當前元素是否是重復的,再進行處理:

Array.prototype.distinct2 = function() {
    var ret = [],
        tempArr = {};
    for (var i = 0; i < this.length; i++) {
        if (tempArr[this[i] + 1]) {
            ret.push(this[i]);
            this.splice(i, 1);
            i--;
            continue;
        }
        tempArr[this[i] + 1] = true;
    }
    tempArr = null;
    return ret;
};

  這里買個小關子,代碼里有個this[i]+1,有人知道為什么要+1嗎?

小結

  這兩題考察的內容都比較基礎,主要考察了繼承、原型、setInterval、閉包、基本算法等。期待高手給出不同方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM