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

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 13:17:47
字體:
來源:轉載
供稿:網友

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

<script type="text/javascript">  //ECMA-262把對象定義為:“無序屬性的 集合,其屬性可以包含基本值、對象或者函數”  //理解對象,最簡單的方式就是通過創建一個Object的實例,然后為它添加屬性和方法  var person = new Object();  person.name = "Xulei";  person.age = "23";  person.job = "前端工程師";  person.sayName = function () {   alert(this.name);  }  //還可以這樣寫  var person = {   name: "xulei",   age: 23,   job: "前端工程",   sayName: function () {    alert(this.name)   }  }  //一、屬性類型:數據屬性和訪問其屬性  //1、數據屬性,有4個描述其行為的特性  //[Configurable]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性,默認值為true  //[Enumerable]:表示能否通過for-in返回屬性,默認值為true  //[Writable]:表示能否修改屬性,默認值為true  //[Value]:包含這個屬性的數據值。默認值為undefined  var person = {   name: "xulei"  }  //這里創建了一個person對象,value值就是“xulei”  //要修改屬性的默認特性,必須使用ECMAScript5的Object.defineProperty(屬性所在的對象,屬性的名字,描述符對象)  //描述符對象必須是configurable、enumerable、writable、value  var peron = {}  Object.defineProperty(peron, "name", {   writable: false,//屬性不能被修改   value: "徐磊-xulei"  });  alert(peron.name);//徐磊-xulei  peron.name = "徐磊";  alert(peron.name);//徐磊-xulei  //以上操作在非嚴格模式下賦值操作會被忽略,如果在嚴格模式下會拋出異常  //一旦把屬性定義為不可配置的就不能把它變回可配置的了。  //在多數情況下都沒有必要利用Object.defineProperty()方法提供的這些高級功能。但是對理解javascript非常有用。  //建議讀者不要在ie8上使用此方法。  //2、訪問其屬性,有4個特性  //[Configurable]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性,默認值為true  //[Enumerable]:表示能否通過for-in返回屬性,默認值為true  //[Get]:在讀取時調用的函數 默認值undefined  //[Set]:在寫入屬性時調用的函數 默認值Undefined  var book={   _year:2004,   edition:1  }  Object.defineProperty(book,"year",{   get:function(){    return this._year;   },   set:function(value){    if(value>2004){     this._year=value;     this.edition +=value-2004;    }   }  });  book.year=2005;  alert(book.edition);//2  //創建對象  //1、將構造函數當做函數  function Person(name,age,job) {   this.name=name;   this.age=age;   this.job=job;   this.sayName=function(){    alert(this.name);   }  }  //當做構造函數使用  var person=new Person("xulei",23,"software");  person.sayName();  //作為普通函數使用  Person("xulei2",23,"job2");//添加到window中  window.sayName();  //在另一個對象的作用域中調用  var o=new Object();  Person.call(o,"xulei3",23,"job3");  o.sayName(); </script>

再來一段:

<script type="text/javascript">    //1、理解原型對象    //2、原型與in操作符    //3、更簡單的原型語法    //4、原型的動態性    //5、原生對象原型    //6、原型對象的問題    //1、無論什么時候,只要創建了一個函數,就會根據一組特定的規則,為該函數創建一個prototype屬性,該屬性指向函數的原型對象    //在默認情況下,所有的原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性包含一個指向prototype屬性所在函數的指針    //如    function Person(){    }    //Person.prototype.constructor 指向Person    //創建了自定義的構造函數之后,其原型對象默認只會取得constructor屬性,至于其他方法則都是從Object繼承而來    //當調用函數的創建一個新實例之后,該實例的內部包含一個指針(內部屬性)指向構造函數的原型對象    //在Firefox、safari、chrome在每個對象上都支持一個屬性_proto_訪問    var p1=new Person();    alert(Person.prototype.isPrototypeOf(p1))    alert(Object.getPrototypeOf(p1)==Person.prototype)    //雖然可以通過對象實例訪問保存在原型中的值,但卻不能通過對象實例重寫原型中的值。如果我們在實例中添加了一個屬性    //而該屬性的名稱與原型的中的實例同名,那我們就在實例中創建該屬性,該屬性將會屏蔽原型中的那個屬性。eg:    function Person() {    }    Person.prototype.name="amber";    Person.prototype.age=23;    Person.prototype.job="software engineer";    Person.prototype.sayName=function(){      alert(this.name)    }    var person1=new Person();    var person2=new Person();    person1.name="amber.Xu";    alert(person1.name);//amber.xu --來自實例    alert(person2.name);//amber --來自原型    delete person1.name;    alert(person1.name);//amber --來自原型    //使用hasOwnProperty()方法可以檢測一個屬性是存在于實例中還是存在于原型中,這個方法(從Object繼承而來)    //只在給定屬性存在于對象實例中時,才會返回true    function Person() {    }    Person.prototype.name="amber";    Person.prototype.age=23;    Person.prototype.job="software engineer";    Person.prototype.sayName=function(){      alert(this.name)    }    var person1=new Person();    var person2=new Person();    alert(person1.hasOwnProperty("name"));//false 來自實例    alert(person2.hasOwnProperty("name"));//false 來自實例    person1.name="amber.xu";    alert(person1.name);    alert(person1.hasOwnProperty("name"));//true 來自實例    delete person1.name;    alert(person1.name);    alert(person1.hasOwnProperty("name"));//false 來自原型    //2、原型與in操作符    //in 有兩種使用方式,一個是的單獨使用和在for-in 中使用。在單獨使用時,in操作符會在對象能夠訪問給定屬性時返回true    //無論該屬性時來自原型還是實例    function Person() {    }    Person.prototype.name="amber";    Person.prototype.age=23;    Person.prototype.job="software engineer";    Person.prototype.sayName=function(){      alert(this.name)    }    var person1=new Person();    var person2=new Person();    alert("name" in person1);//true 來自原型    alert("name" in person2);//true 來自原型    alert("height" in person1);//false    //這樣就可以封裝一個函數(給定屬性是否是來給定對象的原型)    function hasPrototypeProperty(object,name){      return !object.hasOwnProperty(name) && (name in object);    }    alert("----------------------------------");    alert(hasPrototypeProperty(person1,"name"));//true    person1.name="張三";    alert(hasPrototypeProperty(person1,"name"));//false    //使用for-in 返回的是所有能夠通過對象訪問、可枚舉的屬性,其中既包含原型屬性也包含實例屬性。    //屏蔽了原型中不可枚舉屬性(將Enumerable標記為false的屬性)的實例屬性也會在for-in中返回    //ie早期版本總中有一個bug:屏蔽了原型中不可枚舉屬性的實例屬性也不會在for-in中返回    //eg:    var o={      toString:function(){        return "my object";      }    };    for(var prop in o){      if(prop=="toString"){        alert("找到了");//在ie早期版本中不會顯示      }    }    //要取得對象上所有可枚舉的屬性,可以使用ECMAScript5的Object.keys()方法。接受一個對象作為參數,    //包含所有可枚舉屬性的字符串數組    function Person() {    }    Person.prototype.name="amber";    Person.prototype.age=23;    Person.prototype.job="software engineer";    Person.prototype.sayName=function(){      alert(this.name)    }    var person1=new Person();    var person2=new Person();    var keys=Object.keys(Person.prototype);    alert(keys)    person1.name="amber.Xu";    person1.age=23;    var keys=Object.keys(person1);    alert(keys)    alert("-----------------------------------------")    //如果想要得到所有的實例屬性不管他是否可以枚舉,都可以使用    alert(Object.getOwnPropertyNames(person1));    alert(Object.getOwnPropertyNames(Person.prototype));    alert("更簡單的原型語法-----------------------------------------")    //3、更簡單的原型語法    function Person() {    }    Person.prototype={      name:"AMBER",      age:23,      job:"software",      sayName:function(){        alert(this.name)      }    }    //這樣寫之后constructor屬性不再指向Person函數,而是指向Object構造函數。    //盡管通過instanceof操作符還能返回正確的結果,但是通過constructor已經無法確定對象的類型了,eg:    var friend=new Person();    alert(friend instanceof Person)//true    alert(friend instanceof Object)//true    alert(friend.constructor==Person);//false    alert(friend.constructor==Object);//true    //如果constructor對你真的很重要,可以向下面一樣設置成適當的值    function Person() {    }    Person.prototype={      constructor:Person,      name:"AMBER",      age:23,      job:"software",      sayName:function(){        alert(this.name)      }    }    var friend=new Person();    alert("手動設置constructor-----------------------------------------")    alert(friend.constructor==Person);//true    //這種手動的添加了constructor會使constructor變成可枚舉的元(原生的constructor屬性時不可枚舉的)。    //這種情況下就可以使用    Object.defineProperty(Person.prototype,"constructor",{      enumerable:false,      value:Person    });    //原型的動態性    var friend=new Person();    Person.prototype.sayHi=function(){      alert("Hi");    }    friend.sayHi();//Hi (正常執行)    //因為實例和原型之間是松散的連接關系,實例與原型之間的連接只不過是一個指針,而非副本    //當我們調用sayHi()方法時,首先會在實例中搜索名為sayHi的方法,在沒找到的情況下會搜索原型。    //但是,如果是重寫整個原型對象,那么情況就不一樣了。    //我們知道,調用構造函數時會為實例添加一個指向最初原型的Prototype指針,而把原型修改為另一個對象就等于切斷了構造函數與最初原型之間的聯系。    //請記?。簩嵗械闹羔槂H指向原型,而不指向構造函數。eg:    function A(){}    var a1=new A();    A.prototype={      constructor:A,      name:"AMBER",      age:23,      job:"software",      sayName:function(){        alert(this.name)      }    }    alert("ERROR-------------------------------------");    alert(a1.sayName());    //我們創建了一個A的實例,然后又重寫了其原型對象,然后在調用a1.sayName()發生了錯誤,因為a指向的原型中不包含以該名字命名的屬性/方法    //原生對象的原型    //原型模式的重要性不僅體現在創建自定義類型方面。就連所有的原生的引用類型,都是采用這種模式創建的。所有的原生引用類型    //都在其構造函數的原型上定義的方法 eg:    alert(typeof Array.prototype.sort);//function    alert(typeof String.prototype.substring);//function    //不僅可以在原生對象的原型取得雖有默認方法的引用,而且可以定義新的方法    //為String類型添加一個startsWith()的方法    String.prototype.startsWith=function(text){      return this.indexOf(text) == 0;    };    var msg="Hello";    alert(msg.startsWith("H"));    //我們并不建議這樣做。    alert("原型對象的問題");    //6、原型對象的問題 實例    function Ques() {    }    Ques.prototype={      constructor:Ques,      name:"amber",      age:23,      job:"IT",      friends:["張三","李四"],//引用類型      sayName:function(){        alert(this.name)      }    };    var q1=new Ques();    var q2=new Ques();    q1.friends.push("王五");    alert(q1.friends);//    alert(q2.friends);//    alert(q1.friends===q2.friends);  //相信大家已經看到了問題,當我創建了兩個實例q1、q2,當我為q1的“朋友”添加了“王五”之后,q2的”朋友“也有了三個張三、李四、王五  //那是因為數組存在于Ques.prototype上,而非q1上。所以出現了如上結果。  //而正是這個問題,我們很少看到有人單獨使用原型模式的原因所在。  </script>

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
大胆欧美人体视频| 久久在线观看视频| 欧美精品videos性欧美| 亚洲成av人乱码色午夜| 日韩精品免费看| 国产欧美精品一区二区| 日韩欧美福利视频| 国产精品极品在线| 中文在线资源观看视频网站免费不卡| 亚洲激情第一页| 亚洲淫片在线视频| 欧美成人激情图片网| 国内免费精品永久在线视频| 蜜臀久久99精品久久久久久宅男| 欧美一级淫片videoshd| 亚洲天堂2020| 中文字幕av一区二区三区谷原希美| 国产精品激情自拍| 日韩av手机在线| 国产精品高清在线| 日本久久久久久| 亚洲精品成a人在线观看| 51午夜精品视频| 北条麻妃在线一区二区| 7777精品久久久久久| 日韩精品在线观看网站| 亚洲色图18p| 久久久久久久av| 国产精品久久久久久五月尺| 亚洲欧美中文日韩在线v日本| 国内精品免费午夜毛片| 最近更新的2019中文字幕| 欧美激情视频免费观看| 国模视频一区二区| 欧美福利小视频| 伊人伊成久久人综合网小说| 国产一区二区三区视频免费| 日韩av毛片网| 亚洲综合视频1区| 国内精品久久久久久| 国产精品v片在线观看不卡| 国产精品日韩欧美大师| 国产va免费精品高清在线观看| 日韩精品视频在线| 亚洲成人久久久久| 国产精品久久久久久久久久ktv| 欧美有码在线视频| 97久久精品人人澡人人爽缅北| 欧美成人激情视频免费观看| 亚洲一区二区三区在线免费观看| 国产精品88a∨| 91高潮精品免费porn| 国产91网红主播在线观看| 成人免费看片视频| 中文字幕免费国产精品| 欧美日韩国产精品一区| 亚洲第一精品电影| 久久久视频免费观看| 日韩av电影在线免费播放| 欧美黄色片视频| 欧美激情综合色综合啪啪五月| 欧美午夜激情小视频| 欧美午夜激情视频| 91a在线视频| 日韩欧美第一页| 青草青草久热精品视频在线观看| 欧美插天视频在线播放| 91地址最新发布| 国产一区二区日韩精品欧美精品| 国产精品一区二区三区久久久| 日本一区二三区好的精华液| 国产精品国内视频| 亚洲视频在线播放| 日韩av电影手机在线观看| 亚洲电影免费观看高清完整版在线观看| 日韩免费电影在线观看| 亚洲精品99久久久久中文字幕| 91精品在线国产| 久久影视电视剧免费网站| 日本中文字幕不卡免费| xx视频.9999.com| 这里只有精品视频在线| 日韩精品在线免费观看| 国产精品美女久久| 国产91|九色| 91精品久久久久久久久久久久久久| 日韩欧美一区二区三区久久| 欧美性在线观看| 萌白酱国产一区二区| 7777免费精品视频| 97久久精品人搡人人玩| 欧美一区二区大胆人体摄影专业网站| 欧美在线视频免费| 国产日韩在线亚洲字幕中文| 国产精品极品美女在线观看免费| 国产精品毛片a∨一区二区三区|国| 欧美在线一级va免费观看| 91久久精品一区| 国产精品一二三视频| 国产在线精品播放| 亚洲精品国精品久久99热| 狠狠色狠狠色综合日日小说| 性欧美xxxx| 亚洲热线99精品视频| 久久亚洲精品一区| 欧美日韩在线视频观看| 久久久国产精彩视频美女艺术照福利| 国产精品美女视频网站| 精品久久久一区二区| 精品一区二区三区四区| 日韩av片永久免费网站| 国内精品视频在线| 国产97在线亚洲| 亚洲国产成人久久综合| 日韩视频―中文字幕| 国产91在线视频| 久久亚洲精品国产亚洲老地址| 欧美一区二区.| 日韩视频在线一区| 欧美在线一区二区视频| 国产精品视频免费在线| 91免费的视频在线播放| 亚洲成人亚洲激情| 欧美极品美女电影一区| 欧美激情乱人伦一区| 久久琪琪电影院| 国产欧美最新羞羞视频在线观看| 久久久久久久久网站| 日韩电影视频免费| 欧美理论片在线观看| www.亚洲天堂| 伊人伊人伊人久久| 日韩欧美成人精品| 91精品国产高清久久久久久91| 色爱av美腿丝袜综合粉嫩av| 国产99久久精品一区二区永久免费| 亚洲成年网站在线观看| 欧美日韩午夜视频在线观看| 欧美另类交人妖| 国产成人精品优优av| 另类专区欧美制服同性| 日韩av大片在线| 欧美性xxxx18| 中文字幕精品www乱入免费视频| 国模精品系列视频| 亚洲第一精品久久忘忧草社区| 日韩69视频在线观看| 91免费精品国偷自产在线| 精品毛片网大全| 欧美一级bbbbb性bbbb喷潮片| 欧美在线视频观看免费网站| 九九精品视频在线观看| 8x拔播拔播x8国产精品| 伊是香蕉大人久久| 久久精品成人一区二区三区| 精品视频在线播放色网色视频| 国产一区二中文字幕在线看| 日韩中文字在线| 国产精品美乳一区二区免费| 久久久久久久一区二区三区| 一区二区在线免费视频| 久久久久久久久久国产精品| 欧美视频在线视频| 日韩视频第一页|