成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript面向對象編程:原型繼承實例

開發 前端
JavaScript并不是一門真正的面向對象的編程語言,在它的語法中并沒有class類,但它能夠很好的支持OOP,本文主要介紹了用JavaScript寫出OOP模式的的一個小例子。

JavaScript不是純的面向對象的語言,而是基于對象的語言,對象的繼承是以原型函數的形式繼承的,下面我們將主要介紹用JavaScript寫出面向對象編程模式的的一個小例子。

推薦閱讀:淺談JavaScript中面向對象技術的模擬

創建基類

***個我們需要創建一個基類來實例化操作。New后面的標識符是對象的constructor,任意一個javascript類都可以這樣創建這樣一個實例。舉個例子,下面的代碼創建了一個person類,然后實例化一個person對象。

  1. function Person(first, last) {  
  2.   this.first = first;  
  3.   this.last = last;  
  4.  }  
  5.  var person = new Person(“John”, “Dough”); 

添加方法

如果你想在類上添加方法來操作這個類的實例,就像這樣,我們就可以通過創建”toString”方法去展示對象里的內容。在我們的基類上這樣實現。

  1. Person.prototype.toString = function() {  
  2.   return this.first + ” ” + this.last;  
  3.  };  
  4.  alert( person ); // displays “John Dough” 

這證明了JavaScript語言的一個特性,“原型”。簡單的說,所有JavaScript對象都有一個私有的原型屬性(_proto_)。這個”私有”意味著這個屬性不可見或者只有對象本身可以訪問。當對對象執行查找某個屬性的時候,它首先查找實例里的是否存在這個屬性,如果沒有,就在對象的”私有”原型上查找。原型可以有他們自己的私有原型,所以查詢可以沿著原型鏈繼續執行,直到找到屬性或者當到達空的私有原型里,依然沒有找到。

創建子類

回到person對象,這個時候,我們需要添加更多的信息,讓這個person看起來像一個面試者。那么,我們這樣定義。

  1. KevLinDev.extend = function(subClass, baseClass) {  
  2.  
  3.    function inheritance() {}  
  4.    inheritance.prototype = baseClass.prototype;  
  5.    subClass.prototype = new inheritance();  
  6.    subClasssubClass.prototype.constructor = subClass;  
  7.    subClass.baseConstructor = baseClass;  
  8.    subClass.superClass = baseClass.prototype;  
  9.  
  10. }  
  11.  
  12. function Employee(first, last, id) {  
  13.  
  14.     // initialize properties here  
  15.  
  16. }  
  17.  
  18. KevLinDev.extend(Employee, Person); 

我們先創建了一個比較方便的函數去設置我們的繼承鏈。我們需要讓baseclass的屬性和subclass的屬性對等。(記住,當我們調用”new”的時候,原型屬性會被拷貝到一個實例的”_proto”中,這樣就把繼承鏈連接起來)。然而,我們不能允許subClass和baseClass的原型都指向同一個對象。看起來如果給baseClass添加方法,然后subClass也同時增加了這個方法,還是比較好的。

但是,如果給subClass添加方法,baseClass也會增加相應的方法。顯然不是我們想要的處理方式。我們需要一種方式來斷開兩個原型但是又允許subClass能繼承baseClass的方法。這個時候就需要原型鏈的幫忙了。

我們先要定義一個叫“inheritance”嵌套的函數。然后,我們把他的原型指向baseClass原型。這樣,任意一個新的“inheritance”實例都有他們自己的”_proto_”,指向基類的原型。最終,我們創建一個“inheritance”實例,然后把它分配給subClass原型。現在我們需要創建一個新的subClass實例,這個實例的”_proto_”將指向“inheritance”實例。“inheritance”實例的私有原型指向基類的公共原型。

這樣,baseClass原型的改變會通過繼承鏈影響到subClass 的實例。因為我們為subclass的原型屬性創建了一個新的對象,我們可以添加到subclass的原型中而不影響基類的原型。(小豪補充:因為我們現在創建的subClass的”_proto_”是指向“inheritance”實例。如果直接 subclass.prototype=  baseClass.prototype;那么給子類添加方法的同時,基類也會增加對應的方法)

每次你創建一個新的對象實例,實例自身的構造器會指向用來實例化的構造器(<instance>. Constructor = <object> )。我會比較一個實例和一個函數的構造器屬性去測試對象實例化的類型。調用“new inheritance() ”把subclass原型構造器指向了將破壞我的測試的“inheritance”函數。我可以通過更新構造器屬性,讓他指向subclass構造器,來修復這個問題。

最終的兩行被當作調用祖先構造器和方法的方便屬性。在下一個部分就需要這樣的代碼了。

調用基類

我們已經定義了一個新的subclass,但是我們依舊需要去合適地初始化。理想狀態下,我們不應該把代碼從person里復制到subclass,employee里。我們需要需找一個好點的方式去傳遞”first”和”last”參數到Person,讓employee自己處理id參數。下面就是實現方法:

  1. function Employee(first, last, id) {  
  2.   Employee.baseConstructor.call(this, first, last);  
  3.   this.id = id;  
  4.   this.add = function(){alert(“add success”)}  
  5.  }  
  6.  
  7. KevLinDev.extend(Employee, Person); 

不可否認,這樣有點丑陋。然而,我們通過”call”調基類方法。這個調用了基類構造器就像前面的”this”。剩余的參數傳遞到了調用的函數上。那么,既然這樣,基類的構造器person將執行在”first”和”last”上的任一處理方法。Employee構造器將處理“id”。

再建立一個子類

我已經發現已經建造了一個oop模式去支持一級而不是兩級或者更多等級的繼承。讓我們再創建一個subclasses去確定我們的概念已經合適成型。

  1. function Manager(first, last, id, department) {  
  2.   Manager.baseConstructor.call(this, first, last, id);  
  3.   this.department = department;  
  4.  }  
  5.  
  6. KevLinDev.extend(Manager, Employee); 

沒其他新的東西,這個代碼看起來和我們的employee的定義差不多,也展示了繼承正在合理的工作。

原文鏈接:http://www.kevlindev.com/tutorials/javascript/inheritance/index.htm

【編輯推薦】

  1. JavaScript應用核心:事件處理概述
  2. 探討JavaScript:優雅的封裝還是執行效率?
  3. 拔開云霧見明月 透析JavaScript定時機制
  4. 揭開Javascript閉包的真實面目
  5. 雕蟲無小技 JavaScript初學者的10個迷你技巧
責任編輯:王曉東 來源: 麥穗的部落格
相關推薦

2011-05-25 10:59:26

Javascript繼承

2012-12-13 11:01:42

IBMdW

2011-05-25 11:15:02

Javascript繼承

2020-10-20 08:35:34

JS基礎進階

2012-01-17 09:34:52

JavaScript

2017-04-21 09:07:39

JavaScript對象編程

2011-08-31 14:48:33

JavaScript

2012-02-27 09:30:22

JavaScript

2023-09-27 23:28:28

Python編程

2011-05-25 10:21:44

Javascript

2011-08-24 13:56:27

JavaScript

2013-09-18 14:01:46

JavaScript

2011-06-28 14:11:33

JavaScript

2020-04-29 14:40:19

JavaScript繼承編程語言

2011-08-24 13:51:56

JavaScript

2018-12-14 11:30:00

JavaScript編程前端

2009-01-04 09:08:30

面向對象繼承接口

2010-03-05 14:44:36

Python繼承

2010-11-17 11:31:22

Scala基礎面向對象Scala

2023-02-22 18:06:35

函數javascript面向對象編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久吹潮日韩动画 | 天堂视频免费 | 久久精品综合 | 中文字幕在线观看日韩 | 亚洲精品国产一区 | 欧美激情在线一区二区三区 | 久久久久亚洲视频 | 91亚洲国产成人久久精品网站 | 亚洲精品一区二区三区中文字幕 | 日本天天操 | 干干干操操操 | 在线日韩视频 | 成人免费大片黄在线播放 | 影音先锋男 | 日日噜噜噜夜夜爽爽狠狠视频, | 亚洲精品一区二区冲田杏梨 | 97超级碰碰 | 日韩免费网站 | 国产精品久久久亚洲 | 日韩在线观看视频一区 | 在线视频国产一区 | 日本二区 | 免费看黄视频网站 | 亚洲天堂成人在线视频 | 国产精品高潮呻吟 | 精品在线观看一区 | 视频一区二区在线观看 | 天天综合网91| av网站在线看 | av夜夜操 | 日韩在线不卡 | 久久国内 | 爱草在线 | 亚洲精品1 | 日韩精品一区二区三区视频播放 | 国产麻豆乱码精品一区二区三区 | 亚洲综合在 | 色香婷婷 | 久久久蜜桃一区二区人 | 国产在线精品区 | 狠狠艹|