99久久免费国产精品-天天爽夜夜爽夜夜爽-色噜噜久久综合伊人一本-国产无遮挡又黄又爽免费视频

首頁>> 開發技術知識>> 平面廣告設計知識>>網站建設中常用javascript中的對象與函數和繼承


網站建設中常用javascript中的對象與函數和繼承

1、 Javascript中的對象

  JavaScript可以說是一個基于對象的編程語言,為什么說是基于對象而不是面向對象,因為JavaScript自身只實現了封裝,而沒有實現繼承和多態。既然他是基于對象的,那么我們就來說說js中的對象。有人說js中所有的都是對象,這句話不完全正確。正確的一方是他強調了對象在js中的重要性,對象在js中無處不在,包括可以構造對象的函數本身也是對象。但是另一方面,js中也有一些簡單的數據類型,包括數字、字符串和布爾值、null值和undefined值,而這些不是對象。那為什么這些類型的值不是對象呢,畢竟他們也有方法。那讓我們來看一下,JavaScript中對于對象的定義,有兩種定義。

  (1)JavaScript中的對象是可變的鍵控集合(keyed collections) (此定義來自老道的那本書的第三章)

  (2)JavaScript中的對象是無序(unordered)的屬性集合,這些屬性可以含有簡單的數據類型、對象、函數;保存在一個對象屬性中的函數也被稱為這個對象的方法。 (來自ECMA-262 的4.3.3)(注:這里所說的屬性是可以在js腳本中創建和訪問的(我們稱之為顯性屬性),不包括系統為對象自動分配的內部屬性)

  那為什么那個簡單的數據類型不是對象呢,主要是因為這些數據類型的值中擁有的方法是不可變的,而一個對象的屬性是應當可以被改變的。

  2、 對象中的原型鏈[[proto]]

  JavaScript中的每個對象創建的時候系統都會自動為其分配一個原型屬性[[proto]],用來連接到他的原型對象。在JavaScript中就是通過每個對象中的[[proto]]來實現對象的繼承關系的。但是對象的[[proto]]屬性在JavaScript是不能訪問和修改的,他是作為一個內部的屬性存在的,而且是在對象被創建的同時由系統自動設定的。

  當訪問一個對象的某一屬性,如果這個屬性在此對象中不存在,就在他的[[proto]]所指的原型對象的屬性中尋找,如果找到則返回,否則繼續沿著[[proto]]鏈一直找下去,直到[[proto]]的連接為null的時候停止。

  3、 函數也是對象

  JavaScript中的函數本身就是一個對象(所以我們經常稱之為函數對象),而且可以說他是js中最重要的對象。之所以稱之為最重要的對象,一方面他可以扮演像其他語言中的函數同樣的角色,可以被調用,可以被傳入參數;另一方面他還被作為對象的構造器(constructor)來使用,可以結合new操作符來創建對象。

  既然函數就是對象,所以必然含有對象擁有的全部性質,包括對象在創建時設定的原型鏈[[proto]]屬性。

  讓我們來看看函數對象和普通對象有什么區別。我們前面說過,對象就是無序的屬性集合,那么函數的屬性和普通對象的屬性有什么不同呢。根據ECMA-262中的13.2節所述,在函數對象創建時,系統會默認為其創建兩個屬性[[call]]和[[constructor]],當函數對象被當做一個普通函數調用的時候(例如myFunc()),“()”操作符指明函數對象的[[call]]屬性就被執行,當他被當做一個構造器被調用的時候(例如new myConst()),他的[[constructor]]屬性就被執行,[[cosntructor]]的執行過程我們將在下一節中介紹。除此之外,當一個函數被創建時,系統會默認的再為其創建一個顯示屬性prototype,并為其賦值為

  this.prototype = {constructor:this}

  具體內容可以參加老道的那本書的第五章。這個函數對象的prototype屬性也是為了js把函數當做構造器來實現繼承是準備的,但是這個屬性是可以在js腳本中訪問和修改的。在這里要強調的一點是,大家一定要區分對象中的[[proto]]屬性和函數對象中的prototype屬性,我在剛開始學習的時候就是因為沒有很好的區分這兩個東西,走了很多的彎路。

  4、 對象的創建

  在js中有兩種創建對象的方法,一種是通過字面量來實現,如

  var Person = {

  “first_name”:’liang’,

  ‘last_name’:’yang’

  }

  另一種方法是通過構造器來創建

  var my = new Person(‘liang’,’yang’);

  其實第一種方式的創建過程相當于調用Object構造器來實現,如下。

  var Person = new Object();

  Person.first_name = ‘liang’;

  Person.last_name = ‘yang’

  所以我們可以把js中所有對象的創建都合并到使用構造器來實現,下面我么來詳細說明構造器創建對象的過程:

  第一步,先創建一個空的對象(既沒有任何屬性),并將這個對象的[[proto]]指向這個構造器函數的prototype屬性對象

  第二步,將這個空的對象作為this指針傳給構造器函數并執行

  第三步,如果上面的函數返回一個對象,則返回這個對象,否則返回第一步創建的對象

  第四步,把函數當做一個類來使用

  由上面的步驟我們可以看出,一般來說函數對象的prototype指向的是一個普通對象,而不是一個函數對象,這個普通對象中的屬在由此函數構造器創建的對象中也可以訪問。由此可以如此設計我們的代碼,假設一個函數就可以代表一個類,這個構造器函數生成的對象就是這個類的實例對象,那么實例對象中應有的屬性和方法應該放在這個構造器函數的prototype中,這個類的靜態方法就可以直接放到這個函數作為對象的屬性中,最后這個函數體就是我們平時在面向對象語言中所說的構造函數(在這里我們要區分連個詞“構造函數”和“構造器函數”,所謂構造函數是指普通的面向對象語言中的類的構造函數,而構造器函數是指javascript中的一個函數被當做構造器使用)。

  在第3節我們說過每個函數的prototype對象中總是含有一個constructor屬性,這個屬性就是連接到我們的這個函數本身。再加之,有這個函數生成的每個對象的[[proto]]屬性都是指向構造器函數的prototype對象,所以通過[[proto]]鏈,每個由構造器函數生成的對象,都有一個constructor屬性,指向生成他的構造器函數,因此我們可以通過這個屬性來判斷這個對象是有哪個構造器函數生成的。

  5、 函數繼承(類繼承)

  說了這么多,終于到了我們可以在javascript中討論繼承的時候了,我們先來考慮一下要實現類的繼承我們都要做些什么,假設我們要從superClass繼承到子類subClass

  為了使得由subClass生成的對象中能夠訪問superClass生成的對象中的屬性,那么可以使subClass.prototype為一個superClass構造函數生成的對象。

  subclass.prototye = new superClass();

  但是問題來了,根據我們在第4節說的new superClass()不僅復制了superClass.prototype中的所有方法,而且還運行了superClass()這個函數,這個函數起到的作用是類中的構造函數。我們知道應該在子類的構造函數中調用父類的構造函數來實現初始化。為此我們可以創建一個構造函數為空的,但是原型和superClass原型一致的函數,并使subClass.prototype指向這個函數生成的對象。

  var F = function() {};

  F.prototype = superClass.prototype;

  subClass.protptype = new F();

  這樣我們就可以再不調用構造函數的同時完成屬性復制的工作。但是還有一個問題,那就是我們修改了subClass的prototype屬性,從而也就刪除了其中的constructor屬性,這樣我們就無法知道他是哪個構造器函數生成的對象了。我們可以再次給他賦值

  subClass.prototype.constructor = subClass;

  這樣復制屬性的問題就迎刃而解了。但是新的問題又出現了,在subClass中我們無法知道他的父類是哪個構造器函數,所以就無法在構造函數中調用父類的構造函數,為此我們可以為subClass添加一個屬性,指明他的父類

  subClass.superClass = superClass.prototype;

  這樣我么就可以在子類的構造函數中使用subClass.superClass.constructor來訪問父類的構造函數了。最后我們把以上的思路寫成一個函數

  myPro.extend = function (subClass,superClass) {

  var F = function() {};

  F.prototype = superClass.prototype;

  subClass.protptype = new F();

  subClass.prototype.constructor = subClass;

  subClass.superClass = superClass.prototype;

  superClass.prototype.constructor = superClass;

  }



分享聯系我們

掃二維碼與項目經理溝通 我們在微信上24小時期待你的聲音

感謝您的關注分享“網站建設中常用javascript中的對象與函數和繼承”
煙寒網絡真誠為您服務 ,點擊客服直接咨詢下單.

我們服務

南寧網絡公司南寧網站建設

網站建設

高端網站建設服務商、相信品牌力量、相信知名企業;制作后收費13014982176!

南寧微信小程序/微信公眾號

微信小程序/微信公眾號

微信小程序 背靠10億流量,不論用戶需求是什么,都能被開發使用 一點創意,就能在“社交圈”中脫穎而出。

南寧網站優化/SEO

網站優化/SEO

讓您的網站更靠近排名位置,讓客戶更容易找到您,seo優化是一個漫長過程,整個網站營銷花最少的錢起最大的作用。

我們服務客戶


企業形象網站、個人博客、政府門戶網站、新聞傳媒網站最省錢、省時、省備案 建站快、效率高更多服務
廣西華崧集團網站品牌設計

廣西華崧集團網站品牌設計

廣西華崧林業發展集團(以下簡稱華崧集團)組建于2017年8月,集團總部位于廣西壯...

廣西大和平房地產有限公司

廣西大和平房地產有限公司

廣西鴻生源環保科技有限公司

廣西鴻生源環保科技有限公司

主站蜘蛛池模板: 孩交精品xxxx视频视频| 久久久无码精品亚洲日韩按摩 | 国产av无码久久精品| 国产欧美日韩精品专区| 激情影院内射美女| 少妇人妻无码精品视频| 国产成人免费ā片在线观看| 国产三级精品三级在线观看| 亚洲av无码乱码国产精品久久 | 97午夜理论片在线影院| 亚洲综合区图片小说区| 天天躁夜夜躁狠狠是什么心态| 强插女教师av在线| 99久久国产综合精品swag| 国产精品无码av不卡| 亚洲国产综合人成综合网站 | 牲欲强的熟妇农村老妇女视频| 色www永久免费视频| 成在线人免费视频| 97色偷偷色噜噜狠狠爱网站| 亚洲av无码之国产精品网址蜜芽| 我和岳乱妇三级高清电影| 少妇无码太爽了在线播放| 无码人妻一区二区三区免费看| 大陆国产乱人伦| 亚洲加勒比无码一区二区| 亚洲av无码成人精品区在线观看| 九九综合va免费看| yw尤物av无码国产在线看| 野狼第一精品社区| 他掀开裙子把舌头伸进去添视频| 亚洲日本天堂在线| 猫咪av永久网址www大全| 成 人 免费 黄 色 网站无毒 | 熟女少妇精品一区二区| 97免费人妻无码视频| 四虎国产精品永久一区高清| 久久久久久曰本av免费免费| 亚洲处破女av日韩精品| 极品粉嫩小泬无遮挡20p| 国产95在线 | 亚洲|