1. 程式人生 > >javascript之複用內建建構函式

javascript之複用內建建構函式

有時,我們可能想要建立一個物件,該物件包含一組資料。如果僅僅是集合,我們可以使用陣列。但是有時,需要儲存 更多狀態,可能就需要儲存更多集合相關的元資料。

一種方式是建立這類物件的新版本,新增元資料屬性和方法,我們可以在物件上新增屬性和方法,包括陣列。然而這種方法效率低,且單調乏味。

我們如何使用簡單物件,並加上我們需要的方法。處理集合的方法在Array物件上,如何引入到我們的自定義的物件上呢?

<input id="first">
<input id="second">

<script>
console.log('---------------------------複用內建的陣列函式--------------------------');
const elems = {
  //用於模擬陣列長度,儲存集體中元素的數量
  length: 0,
  add: function (elem) {
    //實現向集合新增元素的add方法。陣列的原型方法既然已經實現,那麼為什麼不直接使用它。
    Array.prototype.push.call(this, elem);
  },
  gather: function (id) {
    //實現通過ID查詢元素並新增集合中的方法
    this.add(document.getElementById(id));
  },
  find: function (callback) {
    //複用陣列的find方法,實現在集合中查詢元素的方法
    return Array.prototype.find.call(this, callback);
  }
};

elems.gather("first");
if (elems.length === 1 && elems[0].nodeType) {
  console.log("element[0]'s nodeType:" +  elems[0].nodeType + ",id:" + elems[0].id);
  console.log("Verify that we have an element in our stash");
}

elems.gather("second");
if (elems.length === 2 && elems[1].nodeType) {
  console.log("element[1]'s nodeType:" + elems[1].nodeType);
  console.log("Verity the other insertion");
}

let founds = elems.find(elem => elem.id === 'second');
console.log("founds:" + JSON.stringify(founds));
if (founds && founds[0].id === 'second') {
  console.log("We have found our element");
}
</script>

 

 

出現的問題?

為什麼elems.find(elem => elem.id === 'second')沒有執行成功?

 

在本例中,我們建立物件,並模擬一些陣列的行為。首先定義length屬性用於儲存元素的數量,與陣列類似。然後定義在末尾新增元素的add方法:

add: function (elem) {

//實現向集合新增元素的add方法。陣列的原型方法既然已經實現,那麼為什麼不直接使用它。

Array.prototype.push.call(this, elem);

}

複用Javascript陣列的方法:Array.prototype.push,而不是自己編寫程式碼。

通常,Array.prototype.push方法通過自身函式上下文執行陣列。但是,我們通過使用call方法,將上下文改為我定義的物件。push方法增加length屬性(類似於陣列的length屬性),為所新增的元素增加編號。通過這種方式,該物件的行為是顛覆性的,也說明可變物件上下文的用途。

add方法接收一個待新增到物件中的元素作為引數。有時可能沒有類似的元素,因此,我們又定義了一個gather方法,該方法更為方便,可以通過ID查詢到元素並新增到物件中。

gather: function (id) {

//實現通過ID查詢元素並新增集合中的方法

this.add(document.getElementById(id));

}

最後,利用內建的陣列方法find方法實現自定義物件的find方法,用於查詢自定義物件中任意元素。

find: function (callback) {

//複用陣列的find方法,實現在集合中查詢元素的方法

return Array.prototype.find.call(this, callback);

}

 

參考《JavaScript忍者祕籍》