亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

javascript面向對象程序設計(一)

2024-05-06 16:15:29
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了javascript面向對象程序設計,分享給大家一段代碼,注釋里講解的非常詳細,有助于我們理解面向對象,這里推薦給大家。

注釋里講解的十分細致了,這里就不多廢話了,直接上代碼:

 

 
  1. <script type="text/javascript"
  2. //ECMA-262把對象定義為:“無序屬性的 集合,其屬性可以包含基本值、對象或者函數” 
  3. //理解對象,最簡單的方式就是通過創建一個Object的實例,然后為它添加屬性和方法 
  4. var person = new Object(); 
  5. person.name = "Xulei"
  6. person.age = "23"
  7. person.job = "前端工程師"
  8. person.sayName = function () { 
  9. alert(this.name); 
  10. //還可以這樣寫 
  11. var person = { 
  12. name: "xulei"
  13. age: 23, 
  14. job: "前端工程"
  15. sayName: function () { 
  16. alert(this.name) 
  17. //一、屬性類型:數據屬性和訪問其屬性 
  18. //1、數據屬性,有4個描述其行為的特性 
  19. //[Configurable]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性,默認值為true 
  20. //[Enumerable]:表示能否通過for-in返回屬性,默認值為true 
  21. //[Writable]:表示能否修改屬性,默認值為true 
  22. //[Value]:包含這個屬性的數據值。默認值為undefined 
  23. var person = { 
  24. name: "xulei" 
  25. //這里創建了一個person對象,value值就是“xulei” 
  26. //要修改屬性的默認特性,必須使用ECMAScript5的Object.defineProperty(屬性所在的對象,屬性的名字,描述符對象) 
  27. //描述符對象必須是configurable、enumerable、writable、value 
  28. var peron = {} 
  29. Object.defineProperty(peron, "name", { 
  30. writable: false,//屬性不能被修改 
  31. value: "徐磊-xulei" 
  32. }); 
  33. alert(peron.name);//徐磊-xulei 
  34. peron.name = "徐磊"
  35. alert(peron.name);//徐磊-xulei 
  36. //以上操作在非嚴格模式下賦值操作會被忽略,如果在嚴格模式下會拋出異常 
  37. //一旦把屬性定義為不可配置的就不能把它變回可配置的了。 
  38. //在多數情況下都沒有必要利用Object.defineProperty()方法提供的這些高級功能。但是對理解javascript非常有用。 
  39. //建議讀者不要在ie8上使用此方法。 
  40. //2、訪問其屬性,有4個特性 
  41. //[Configurable]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性,默認值為true 
  42. //[Enumerable]:表示能否通過for-in返回屬性,默認值為true 
  43. //[Get]:在讀取時調用的函數 默認值undefined 
  44. //[Set]:在寫入屬性時調用的函數 默認值Undefined 
  45. var book={ 
  46. _year:2004, 
  47. edition:1 
  48. Object.defineProperty(book,"year",{ 
  49. get:function(){ 
  50. return this._year; 
  51. }, 
  52. set:function(value){ 
  53. if(value>2004){ 
  54. this._year=value; 
  55. this.edition +=value-2004; 
  56. }); 
  57. book.year=2005; 
  58. alert(book.edition);//2 
  59. //創建對象 
  60. //1、將構造函數當做函數 
  61. function Person(name,age,job) { 
  62. this.name=name; 
  63. this.age=age; 
  64. this.job=job; 
  65. this.sayName=function(){ 
  66. alert(this.name); 
  67. //當做構造函數使用 
  68. var person=new Person("xulei",23,"software"); 
  69. person.sayName(); 
  70. //作為普通函數使用 
  71. Person("xulei2",23,"job2");//添加到window中 
  72. window.sayName(); 
  73. //在另一個對象的作用域中調用 
  74. var o=new Object(); 
  75. Person.call(o,"xulei3",23,"job3"); 
  76. o.sayName(); 
  77. </script> 

再來一段:

 

 
  1. <script type="text/javascript"
  2. //1、理解原型對象 
  3. //2、原型與in操作符 
  4. //3、更簡單的原型語法 
  5. //4、原型的動態性 
  6. //5、原生對象原型 
  7. //6、原型對象的問題 
  8.  
  9. //1、無論什么時候,只要創建了一個函數,就會根據一組特定的規則,為該函數創建一個prototype屬性,該屬性指向函數的原型對象 
  10. //在默認情況下,所有的原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性包含一個指向prototype屬性所在函數的指針 
  11. //如 
  12. function Person(){ 
  13.  
  14. //Person.prototype.constructor 指向Person 
  15. //創建了自定義的構造函數之后,其原型對象默認只會取得constructor屬性,至于其他方法則都是從Object繼承而來 
  16. //當調用函數的創建一個新實例之后,該實例的內部包含一個指針(內部屬性)指向構造函數的原型對象 
  17. //在Firefox、safari、chrome在每個對象上都支持一個屬性_proto_訪問 
  18. var p1=new Person(); 
  19. alert(Person.prototype.isPrototypeOf(p1)) 
  20.  
  21. alert(Object.getPrototypeOf(p1)==Person.prototype) 
  22.  
  23. //雖然可以通過對象實例訪問保存在原型中的值,但卻不能通過對象實例重寫原型中的值。如果我們在實例中添加了一個屬性 
  24. //而該屬性的名稱與原型的中的實例同名,那我們就在實例中創建該屬性,該屬性將會屏蔽原型中的那個屬性。eg: 
  25. function Person() { 
  26. Person.prototype.name="amber"
  27. Person.prototype.age=23; 
  28. Person.prototype.job="software engineer"
  29. Person.prototype.sayName=function(){ 
  30. alert(this.name) 
  31.  
  32. var person1=new Person(); 
  33. var person2=new Person(); 
  34. person1.name="amber.Xu"
  35. alert(person1.name);//amber.xu --來自實例 
  36. alert(person2.name);//amber --來自原型 
  37.  
  38. delete person1.name; 
  39. alert(person1.name);//amber --來自原型 
  40.  
  41. //使用hasOwnProperty()方法可以檢測一個屬性是存在于實例中還是存在于原型中,這個方法(從Object繼承而來) 
  42. //只在給定屬性存在于對象實例中時,才會返回true 
  43. function Person() { 
  44. Person.prototype.name="amber"
  45. Person.prototype.age=23; 
  46. Person.prototype.job="software engineer"
  47. Person.prototype.sayName=function(){ 
  48. alert(this.name) 
  49. var person1=new Person(); 
  50. var person2=new Person(); 
  51.  
  52. alert(person1.hasOwnProperty("name"));//false 來自實例 
  53.  
  54. alert(person2.hasOwnProperty("name"));//false 來自實例 
  55.  
  56. person1.name="amber.xu"
  57. alert(person1.name); 
  58. alert(person1.hasOwnProperty("name"));//true 來自實例 
  59.  
  60. delete person1.name; 
  61. alert(person1.name); 
  62. alert(person1.hasOwnProperty("name"));//false 來自原型 
  63.  
  64.  
  65.  
  66. //2、原型與in操作符 
  67. //in 有兩種使用方式,一個是的單獨使用和在for-in 中使用。在單獨使用時,in操作符會在對象能夠訪問給定屬性時返回true 
  68. //無論該屬性時來自原型還是實例 
  69. function Person() { 
  70. Person.prototype.name="amber"
  71. Person.prototype.age=23; 
  72. Person.prototype.job="software engineer"
  73. Person.prototype.sayName=function(){ 
  74. alert(this.name) 
  75. var person1=new Person(); 
  76. var person2=new Person(); 
  77. alert("name" in person1);//true 來自原型 
  78. alert("name" in person2);//true 來自原型 
  79. alert("height" in person1);//false 
  80.  
  81.  
  82. //這樣就可以封裝一個函數(給定屬性是否是來給定對象的原型) 
  83. function hasPrototypeProperty(object,name){ 
  84. return !object.hasOwnProperty(name) && (name in object); 
  85. alert("----------------------------------"); 
  86. alert(hasPrototypeProperty(person1,"name"));//true 
  87.  
  88. person1.name="張三"
  89. alert(hasPrototypeProperty(person1,"name"));//false 
  90.  
  91.  
  92. //使用for-in 返回的是所有能夠通過對象訪問、可枚舉的屬性,其中既包含原型屬性也包含實例屬性。 
  93. //屏蔽了原型中不可枚舉屬性(將Enumerable標記為false的屬性)的實例屬性也會在for-in中返回 
  94. //ie早期版本總中有一個bug:屏蔽了原型中不可枚舉屬性的實例屬性也不會在for-in中返回 
  95. //eg: 
  96. var o={ 
  97. toString:function(){ 
  98. return "my object"
  99. }; 
  100.  
  101. for(var prop in o){ 
  102. if(prop=="toString"){ 
  103. alert("找到了");//在ie早期版本中不會顯示 
  104.  
  105. //要取得對象上所有可枚舉的屬性,可以使用ECMAScript5的Object.keys()方法。接受一個對象作為參數, 
  106. //包含所有可枚舉屬性的字符串數組 
  107. function Person() { 
  108. Person.prototype.name="amber"
  109. Person.prototype.age=23; 
  110. Person.prototype.job="software engineer"
  111. Person.prototype.sayName=function(){ 
  112. alert(this.name) 
  113. var person1=new Person(); 
  114. var person2=new Person(); 
  115. var keys=Object.keys(Person.prototype); 
  116. alert(keys) 
  117.  
  118. person1.name="amber.Xu"
  119. person1.age=23; 
  120. var keys=Object.keys(person1); 
  121. alert(keys) 
  122.  
  123. alert("-----------------------------------------"
  124. //如果想要得到所有的實例屬性不管他是否可以枚舉,都可以使用 
  125. alert(Object.getOwnPropertyNames(person1)); 
  126. alert(Object.getOwnPropertyNames(Person.prototype)); 
  127.  
  128. alert("更簡單的原型語法-----------------------------------------"
  129. //3、更簡單的原型語法 
  130. function Person() { 
  131.  
  132.  
  133. Person.prototype={ 
  134. name:"AMBER"
  135. age:23, 
  136. job:"software"
  137. sayName:function(){ 
  138. alert(this.name) 
  139.  
  140. //這樣寫之后constructor屬性不再指向Person函數,而是指向Object構造函數。 
  141. //盡管通過instanceof操作符還能返回正確的結果,但是通過constructor已經無法確定對象的類型了,eg: 
  142. var friend=new Person(); 
  143. alert(friend instanceof Person)//true 
  144. alert(friend instanceof Object)//true 
  145. alert(friend.constructor==Person);//false 
  146. alert(friend.constructor==Object);//true 
  147. //如果constructor對你真的很重要,可以向下面一樣設置成適當的值 
  148.  
  149. function Person() { 
  150.  
  151.  
  152. Person.prototype={ 
  153. constructor:Person, 
  154. name:"AMBER"
  155. age:23, 
  156. job:"software"
  157. sayName:function(){ 
  158. alert(this.name) 
  159. var friend=new Person(); 
  160. alert("手動設置constructor-----------------------------------------"
  161. alert(friend.constructor==Person);//true 
  162.  
  163. //這種手動的添加了constructor會使constructor變成可枚舉的元(原生的constructor屬性時不可枚舉的)。 
  164. //這種情況下就可以使用 
  165. Object.defineProperty(Person.prototype,"constructor",{ 
  166. enumerable:false
  167. value:Person 
  168. }); 
  169.  
  170.  
  171. //原型的動態性 
  172. var friend=new Person(); 
  173. Person.prototype.sayHi=function(){ 
  174. alert("Hi"); 
  175.  
  176. friend.sayHi();//Hi (正常執行) 
  177. //因為實例和原型之間是松散的連接關系,實例與原型之間的連接只不過是一個指針,而非副本 
  178. //當我們調用sayHi()方法時,首先會在實例中搜索名為sayHi的方法,在沒找到的情況下會搜索原型。 
  179.  
  180. //但是,如果是重寫整個原型對象,那么情況就不一樣了。 
  181. //我們知道,調用構造函數時會為實例添加一個指向最初原型的Prototype指針,而把原型修改為另一個對象就等于切斷了構造函數與最初原型之間的聯系。 
  182. //請記住:實例中的指針僅指向原型,而不指向構造函數。eg: 
  183. function A(){} 
  184. var a1=new A(); 
  185. A.prototype={ 
  186. constructor:A, 
  187. name:"AMBER"
  188. age:23, 
  189. job:"software"
  190. sayName:function(){ 
  191. alert(this.name) 
  192. alert("ERROR-------------------------------------"); 
  193. alert(a1.sayName()); 
  194. //我們創建了一個A的實例,然后又重寫了其原型對象,然后在調用a1.sayName()發生了錯誤,因為a指向的原型中不包含以該名字命名的屬性/方法 
  195.  
  196. //原生對象的原型 
  197. //原型模式的重要性不僅體現在創建自定義類型方面。就連所有的原生的引用類型,都是采用這種模式創建的。所有的原生引用類型 
  198. //都在其構造函數的原型上定義的方法 eg: 
  199. alert(typeof Array.prototype.sort);//function 
  200. alert(typeof String.prototype.substring);//function 
  201. //不僅可以在原生對象的原型取得雖有默認方法的引用,而且可以定義新的方法 
  202. //為String類型添加一個startsWith()的方法 
  203. String.prototype.startsWith=function(text){ 
  204. return this.indexOf(text) == 0; 
  205. }; 
  206. var msg="Hello"
  207. alert(msg.startsWith("H")); 
  208.  
  209. //我們并不建議這樣做。 
  210.  
  211. alert("原型對象的問題"); 
  212. //6、原型對象的問題 實例 
  213. function Ques() { 
  214.  
  215. Ques.prototype={ 
  216. constructor:Ques, 
  217. name:"amber"
  218. age:23, 
  219. job:"IT"
  220. friends:["張三","李四"],//引用類型 
  221. sayName:function(){ 
  222. alert(this.name) 
  223. }; 
  224.  
  225. var q1=new Ques(); 
  226. var q2=new Ques(); 
  227. q1.friends.push("王五"); 
  228. alert(q1.friends);// 
  229. alert(q2.friends);// 
  230. alert(q1.friends===q2.friends); 
  231. //相信大家已經看到了問題,當我創建了兩個實例q1、q2,當我為q1的“朋友”添加了“王五”之后,q2的”朋友“也有了三個張三、李四、王五 
  232. //那是因為數組存在于Ques.prototype上,而非q1上。所以出現了如上結果。 
  233.  
  234. //而正是這個問題,我們很少看到有人單獨使用原型模式的原因所在。 
  235. </script> 

本文就先到這里了,后續我們再繼續討論javascript面向對象程序設計,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情第1页| 国产成人在线一区二区| 亚洲成人精品在线| 精品丝袜一区二区三区| 日韩一区二区在线视频| 夜夜狂射影院欧美极品| 国产精品盗摄久久久| 日韩成人xxxx| 亚洲福利视频网| 成人黄色午夜影院| 亚洲国产精品视频在线观看| 91免费高清视频| 97在线视频免费观看| 久久久久久久久久av| 日韩av影片在线观看| 久久精彩免费视频| 久久久精品在线观看| 中日韩美女免费视频网址在线观看| 亚洲福利视频免费观看| 在线观看视频亚洲| 国产美女直播视频一区| 日韩精品免费综合视频在线播放| 中文在线资源观看视频网站免费不卡| 亚洲视频综合网| 草民午夜欧美限制a级福利片| 亚洲free性xxxx护士白浆| 亚洲的天堂在线中文字幕| 久久国产一区二区三区| 欧美大尺度激情区在线播放| 亚洲最大中文字幕| 日韩久久精品电影| 亚洲美女喷白浆| 亚洲综合一区二区不卡| 日韩欧美999| 国产亚洲一区精品| 中文字幕v亚洲ⅴv天堂| 久久国产精品99国产精| 成人免费看吃奶视频网站| 午夜精品一区二区三区在线视频| 永久555www成人免费| 日韩a**站在线观看| 国产成人高清激情视频在线观看| 欧美成人sm免费视频| 国产成人精品在线视频| 91免费看片在线| 国产精品大片wwwwww| 午夜精品一区二区三区在线视频| 夜夜狂射影院欧美极品| 日韩在线观看电影| 欧美噜噜久久久xxx| 97久久久久久| 国产区精品视频| 久久久91精品国产| 亚洲天堂色网站| 欧美亚洲成人xxx| 久久中国妇女中文字幕| 亚洲免费高清视频| 一区二区三区精品99久久| 欧美日韩国产丝袜另类| 久久久久久国产精品久久| 国产亚洲精品一区二555| 亚洲人成电影网站色…| 国产精品免费观看在线| 97在线观看免费| 亚洲欧美国产精品专区久久| 国产精品视频免费在线观看| 亚州成人av在线| 国产精品美乳一区二区免费| 国产精品狠色婷| 亚洲视频综合网| 国产精品久久久久久av福利| 97视频免费看| 狠狠色噜噜狠狠狠狠97| 亚洲精品免费av| 欧美激情精品在线| 91中文在线观看| 中文字幕亚洲综合| 欧美精品激情在线观看| 91理论片午午论夜理片久久| 久久免费精品日本久久中文字幕| 精品亚洲永久免费精品| 国产精品一区二区久久精品| 欧美日韩中文在线| 一区二区亚洲精品国产| 91网站在线免费观看| 欧美国产日韩精品| 久久精品91久久香蕉加勒比| 国产精品视频公开费视频| 欧美精品在线免费| 欧美大人香蕉在线| 久久久亚洲网站| 97**国产露脸精品国产| 亚洲人成绝费网站色www| 国产精品电影在线观看| 精品自在线视频| 欧美激情一区二区三区高清视频| 欧美成人精品在线观看| 国产欧美精品一区二区| 国产精品美女久久| 欧美视频免费在线观看| 91在线观看欧美日韩| 狠狠操狠狠色综合网| 亚洲国产97在线精品一区| 国产成人一区二区在线| 国内精品视频在线| 亚洲国产日韩一区| 久久国产精品视频| 国产婷婷成人久久av免费高清| 亚洲国产精品悠悠久久琪琪| 亚洲精品一区二区三区不| 国产亚洲aⅴaaaaaa毛片| 97久久精品人搡人人玩| 欧日韩不卡在线视频| 美女撒尿一区二区三区| 奇米成人av国产一区二区三区| 欧美亚洲成人网| 伊人男人综合视频网| 欧美亚洲免费电影| 欧美与黑人午夜性猛交久久久| 久久国产精彩视频| 国产精品美女无圣光视频| 日韩的一区二区| 亚洲视频999| xvideos国产精品| 亚洲午夜精品视频| 日本精品在线视频| 色综合天天综合网国产成人网| 精品一区二区三区电影| 一级做a爰片久久毛片美女图片| 成人国产精品一区| 亚洲国产高清福利视频| 日韩亚洲一区二区| 国产精品日韩精品| 亚洲黄页网在线观看| 国产精品夫妻激情| 日韩精品中文在线观看| 九九久久综合网站| 亚洲国产精品va在线看黑人| 欧美日韩在线观看视频| 一区二区三区视频观看| 久久伊人精品一区二区三区| 日韩最新中文字幕电影免费看| 国产亚洲精品激情久久| 久久视频精品在线| 亚洲国产精品va在线观看黑人| 欧美电影在线观看| 亚洲一区二区久久久久久久| 日韩高清av一区二区三区| 亚洲综合中文字幕68页| 国产色婷婷国产综合在线理论片a| 这里只有精品视频在线| 91在线高清视频| 亚洲精品suv精品一区二区| 亚洲国产免费av| 国产69精品久久久久99| 亚洲天堂av电影| 亚洲最大av网| 日韩精品有码在线观看| 色樱桃影院亚洲精品影院| 一级做a爰片久久毛片美女图片| 久久电影一区二区| 亚洲人成人99网站| 亚洲影影院av| 日韩视频第一页|