中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解JavaScript中的面向對象

發布時間:2021-11-20 14:09:42 來源:億速云 閱讀:113 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么理解JavaScript中的面向對象”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么理解JavaScript中的面向對象”吧!

  JavaScript 是面向對象的。但是不少人對這一點理解得并不全面。
  在 JavaScript 中,對象分為兩種。一種可以稱為“普通對象”,就是我們所普遍理解的那些:數字、日期、用戶自定義的對象(如:{})等等。
  還有一種,稱為“方法對象”,就是我們通常定義的 function。你可能覺得奇怪:方法就是方法,怎么成了對象了?但是在 JavaScript 中,方法的確是被當成對象來處理的。下面是一個簡單的例子:
  function func() {alert('Hello!');}
  alert(func.toString());
  在這個例子中,func 雖然是作為一個方法定義的,但它自身卻包含一個 toString 方法,說明 func 在這里是被當成一個對象來處理的。更準確的說,func 是一個“方法對象”。下面是例子的繼續:
  func.name = “I am func.”;
  alert(func.name);
  我們可以任意的為 func 設置屬性,這更加證明了 func 就是一個對象。那么方法對象和普通對象的區別在哪里呢?首先方法對象當然是可以執行的,在它后面加上一對括號,就是執行這個方法對象了。
  func();
  所以,方法對象具有二重性。一方面它可以被執行,另一方面它完全可以被當成一個普通對象來使用。這意味著什么呢?這意味著方法對象是可以完全獨立于其他對象存在的。這一點我們可以同 Java 比較一下。在 Java 中,方法必須在某一個類中定義,而不能單獨存在。而 JavaScript 中就不需要。
  方法對象獨立于其他方法,就意味著它能夠被任意的引用和傳遞。下面是一個例子:
  function invoke(f) {
  f();
  }
  invoke(func);
  將一個方法對象 func 傳遞給另一個方法對象 invoke,讓后者在適當的時候執行 func。這就是所謂的“回調”了。另外,方法對象的這種特殊性,也使得 this 關鍵字不容易把握。這方面相關文章不少,這里不贅述了。
  除了可以被執行以外,方法對象還有一個特殊的功用,就是它可以通過 new 關鍵字來創建普通對象。
  話說每一個方法對象被創建時,都會自動的擁有一個叫 prototype 的屬性。這個屬性并無什么特別之處,它和其他的屬性一樣可以訪問,可以賦值。不過當我們用 new 關鍵字來創建一個對象的時候,prototype 就起作用了:它的值(也是一個對象)所包含的所有屬性,都會被復制到新創建的那個對象上去。下面是一個例子:
  func.prototype.name=”prototype of func”;
  var f = new func();
  alert(f.name);
  執行的過程中會彈出兩個對話框,后一個對話框表示 f 這個新建的對象從 func.prototype 那里拷貝了 name 屬性。而前一個對話框則表示 func 被作為方法執行了一遍。你可能會問了,為什么這個時候要還把 func 執行一遍呢?其實這個時候執行 func,就是起“構造函數”的作用。為了形象的說明,我們重新來一遍:
  function func() {
  this.name=”name has been changed.”
  }
  func.prototype.name=”prototype of func”;
  var f = new func();
  alert(f.name);
  你就會發現 f 的 name 屬性不再是"prototype of func",而是被替換成了"name has been changed"。這就是 func 這個對象方法所起到的“構造函數”的作用。所以,在 JavaScript 中,用 new 關鍵字創建對象是執行了下面三個步驟的:
  創建一個新的普通對象;
  將方法對象的 prototype 屬性的所有屬性復制到新的普通對象中去。
  以新的普通對象作為上下文來執行方法對象。
  對于“new func()”這樣的語句,可以描述為“從 func 創建一個新對象”。總之,prototype 這個屬性的唯一特殊之處,就是在創建新對象的時候了。
  那么我們就可以利用這一點。比如有兩個方法對象 A 和 B,既然從 A 創建的新對象包含了所有 A.prototype 的屬性,那么我將它賦給 B.prototype,那么從 B 創建的新對象不也有同樣的屬性了?寫成代碼就是這樣:
  
  A.prototype.hello = function(){alert('Hello!');}
  B.prototype = new A();
  new B().hello();
  這就是 JavaScript 的所謂“繼承”了,其實質就是屬性的拷貝,這里利用了 prototype 來實現。如果不用 prototype,那就用循環了,效果是一樣的。所謂“多重繼承”,自然就是到處拷貝了。
  JavaScript 中面向對象的原理,就是上面這些了。自始至終我都沒提到“類”的概念,因為 JavaScript 本來就沒有“類”這個東西。面向對象可以沒有類嗎?當然可以。先有類,然后再有對象,這本來就不合理,因為類本來是從對象中歸納出來的,先有對象再有類,這才合理。像下面這樣的:
  var o = {}; // 我發現了一個東西。
  o.eat = function(){return "I am eating."} // 我發現它會吃;
  o.sleep = function(){return "ZZZzzz..."} // 我發現它會睡;
  o.talk = function(){return "Hi!"} // 我發現它會說話;
  o.think = function(){return "Hmmm..."} // 我發現它還會思考。
  var Human = new Function(); // 我決定給它起名叫“人”。
  Human.prototype = o; // 這個東西就代表了所有“人”的概念。
  var h = new Human(); // 當我發現其他同它一樣的東西,
  alert(h.talk()) // 我就知道它也是“人”了!

感謝各位的閱讀,以上就是“怎么理解JavaScript中的面向對象”的內容了,經過本文的學習后,相信大家對怎么理解JavaScript中的面向對象這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苍山县| 沁阳市| 定日县| 蒲城县| 武穴市| 易门县| 沁源县| 开远市| 天水市| 西充县| 玉树县| 嘉义县| 鄂伦春自治旗| 固始县| 安西县| 禄丰县| 镇巴县| 南充市| 开封市| 平顺县| 都兰县| 钟祥市| 霍州市| 深州市| 和静县| 郯城县| 宝坻区| 汉寿县| 山阴县| 青州市| 甘孜| 黎城县| 徐州市| 尼木县| 甘南县| 色达县| 牟定县| 仁怀市| 雅江县| 隆昌县| 紫金县|