面向?qū)ο蟮某绦蛟O(shè)計

一、對象屬性類型

????1瞭郑、數(shù)據(jù)屬性:數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置可很。在這個位置可以讀取和寫入值。數(shù)據(jù)屬性有 4 個描述其行為的特性凰浮。

????????[[Configurable]]:表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性苇本,或者能否把屬性修改為訪問器屬性袜茧。像前面例子中那樣直接在對象上定義的屬性,它們的這個特性默認(rèn)值為 true瓣窄。

????????[[Enumerable]]:表示能否通過 for-in 循環(huán)返回屬性笛厦。像前面例子中那樣直接在對象上定義的屬性,它們的這個特性默認(rèn)值為 true俺夕。

????????[[Writable]]:表示能否修改屬性的值裳凸。像前面例子中那樣直接在對象上定義的屬性,它們的這個特性默認(rèn)值為 true劝贸。

????????[[Value]]:包含這個屬性的數(shù)據(jù)值姨谷。讀取屬性值的時候,從這個位置讀;寫入屬性值的時候映九,把新值保存在這個位置梦湘。這個特性的默認(rèn)值為 undefined。

? ? ?????要修改屬性默認(rèn)的特性件甥,必須使用 ECMAScript 5 的 Object.defineProperty()方法捌议。這個方法 接收三個參數(shù):屬性所在的對象、屬性的名字和一個描述符對象引有。其中瓣颅,描述符(descriptor)對象的屬 性必須是:configurable、enumerable譬正、writable 和 value宫补。設(shè)置其中的一或多個值檬姥,可以修改 對應(yīng)的特性值。

????????一旦把屬性定義為不可配置的(configurable:false)守谓, 就不能再把它變回可配置了穿铆。此時,再調(diào)用 Object.defineProperty()方法修改除 writable 之外 的特性斋荞,

????????var a = 0,? window.a的configurable默認(rèn)為false荞雏;

????????window.a = 0, window.a的configurable默認(rèn)為true;

????2. 訪問器屬性

????????[[Configurable]]:表示能否通過 delete 刪除屬性從而重新定義屬性平酿,能否修改屬性的特 性凤优,或者能否把屬性修改為數(shù)據(jù)屬性。對于直接在對象上定義的屬性蜈彼,這個特性的默認(rèn)值為 true筑辨。

????????[[Enumerable]]:表示能否通過 for-in 循環(huán)返回屬性。對于直接在對象上定義的屬性幸逆,這 5 個特性的默認(rèn)值為 true棍辕。

?????????[[Get]]:在讀取屬性時調(diào)用的函數(shù)。默認(rèn)值為 undefined还绘。

?????????[[Set]]:在寫入屬性時調(diào)用的函數(shù)楚昭。默認(rèn)值為 undefined。

????????var book = {

????????????? _year: 2004,

????????????edition: 1

????????};

????????Object.defineProperty(book, "year", {

? ? ????????????get: function(){

? ? ? ?????????????return this._year;

? ????? ????????},

? ? ????????????set: function(newValue){????

? ? ? ? ????????????if (newValue > 2004) {

? ? ? ? ? ????? ????this._year = newValue;

? ? ? ? ? ????? ????this.edition += newValue - 2004;

? ????????????? } }

????????});

????????book.year = 2005; alert(book.edition); //2

????????支持 ECMAScript 5 的這個方法的瀏覽器有 IE9+(IE8 只是部分實現(xiàn))拍顷、Firefox 4+抚太、Safari 5+、Opera 12+和 Chrome昔案。在這個方法之前尿贫,要創(chuàng)建訪問器屬性,一般都使用兩個非標(biāo)準(zhǔn)的方法: __defineGetter__()和__defineSetter__()踏揣。這兩個方法最初是由 Firefox 引入的庆亡,后來 Safari 3、 Chrome 1 和 Opera 9.5 也給出了相同的實現(xiàn)呼伸。使用這兩個遺留的方法身冀,可以像下面這樣重寫前面的例子。

????????var book = {

? ????????? _year: 2004,

????????????edition: 1

? ? ? ? };????????

????????//定義訪問器的舊有方法?

????????book.__defineGetter__("year", function(){

? ? ????????return this._year;

????????});

????????book.__defineSetter__("year", function(newValue){

? ????????? if (newValue > 2004) {

? ? ? ????????? this._year = newValue;

? ? ? ????????? this.edition += newValue - 2004;

? ????????? }

????????});

????????book.year = 2005; alert(book.edition); //2

????????在 不 支 持 Object.defineProperty() 方 法 的 瀏 覽 器 中 不 能 修 改 [[Configurable]] 和 [[Enumerable]]括享。

????3搂根、讀取屬性的特性

????????ECMAScript 5 的 Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述 符铃辖。這個方法接收兩個參數(shù):屬性所在的對象和要讀取其描述符的屬性名稱剩愧。返回值是一個對象,如果 是訪問器屬性娇斩,這個對象的屬性有 configurable仁卷、enumerable穴翩、get 和 set;如果是數(shù)據(jù)屬性,這 個對象的屬性有 configurable锦积、enumerable芒帕、writable 和 value。

二丰介、創(chuàng)建對象

????關(guān)于創(chuàng)建對象的幾種模式我就不多贅述了背蟆,總體的思想是將公共方法和屬性放在構(gòu)造函數(shù)的原型中,在這我主要列出ES6及ES6之前的寫法哮幢。

????ES6之前:

????????function Person (name) {

????????????this.name = name

????????}

????????Person.prototype.sayHi = function(){

????????????return? 'sayHi';

????????}

????????var person = new Person('Tom')

????????console.log(person.name)? // Tom

????????console.log(person.sayHi()) // sayHi

????ES6:? class Person {

????????????????????constructor(name){

????????????????????????this.name = name;

????????????????????}

????????????????????sayHi(){

????????????????????????return? 'sayHi';

????????????????????}

? ? ? ? ? ? ? ?}


????????????? let person = new Person('Tom')

????????????? console.log(person.name)? // Tom

????????????? console.log(person.sayHi()) // sayHi

三带膀、繼承

????實現(xiàn)繼承最好的就是寄生組合繼承方法了,ES6的extends也是基于此來實現(xiàn)繼承的橙垢;以下是2種寫法:

????ES6之前:

????????function SuperType (name) {

????????????this.name = name

????????}

????????SuperType.prototype.sayHi = function(){

????????????return? this.name +? 'sayHi';

????????}

????????function SubType (name,age) {

????????????SuperType.call(this,name);

????????????this.age = age

????????}

????????function inheritPrototype(subType, superType){

? ? ????????var prototype = Object.create(superType.prototype);? // ES5 支持 Object.create()

? ???????? prototype.constructor = subType;

? ???????? subType.prototype = prototype;

????????}

????????inheritPrototype(SubType,SuperType);

????????var subType = new SubType('Tom')

????????console.log(subType.name)? // Tom

????????console.log(subType.sayHi()) // TomsayHi

????ES6:? class SuperType {

????????????????constructor(name){

????????????????????this.name = name;

????????????????}

????????????????sayHi(){

????????????????????return? `${this.name}sayHi`;

????????????????}

? ????????? }

? ???????? class SubType? extends SuperType {

????????????????constructor(name,age){

????????????????????super(name)?

????????????????????this.age = age;

????????????????}

? ????????? }

????????? let subType = new SubType('Tom')

? ???????? console.log(subType.name)? // Tom

? ???????? console.log(subType.sayHi()) // TomsayHi

? ? ? ?子類必須在constructor方法中調(diào)用super方法垛叨,否則新建實例時會報錯。如果子類在constructor方法中使用了this初始化實例屬性,調(diào)用super方法必須放到this初始化實例屬性的前面柜某。這是因為子類沒有自己的this對象嗽元,而是繼承父類的this對象,然后對其進(jìn)行加工喂击。如果不調(diào)用super方法还棱,子類就得不到this對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惭等,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子办铡,更是在濱河造成了極大的恐慌辞做,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寡具,死亡現(xiàn)場離奇詭異秤茅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)童叠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門框喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厦坛,你說我怎么就攤上這事五垮。” “怎么了杜秸?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵放仗,是天一觀的道長。 經(jīng)常有香客問我撬碟,道長诞挨,這世上最難降的妖魔是什么莉撇? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮惶傻,結(jié)果婚禮上棍郎,老公的妹妹穿的比我還像新娘。我一直安慰自己银室,他們只是感情好涂佃,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粮揉,像睡著了一般巡李。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扶认,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天侨拦,我揣著相機(jī)與錄音,去河邊找鬼辐宾。 笑死狱从,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叠纹。 我是一名探鬼主播季研,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼誉察!你這毒婦竟也來了与涡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤持偏,失蹤者是張志新(化名)和其女友劉穎驼卖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸿秆,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡酌畜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卿叽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桥胞。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖考婴,靈堂內(nèi)的尸體忽然破棺而出贩虾,到底是詐尸還是另有隱情,我是刑警寧澤沥阱,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布整胃,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屁使。R本人自食惡果不足惜在岂,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛮寂。 院中可真熱鬧蔽午,春花似錦、人聲如沸酬蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽范抓。三九已至骄恶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匕垫,已是汗流浹背僧鲁。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留象泵,地道東北人寞秃。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像偶惠,于是被迫代替她去往敵國和親春寿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348