js原型鏈的研究

理解對象屬性

????????面向?qū)ο笳Z言的標志是都有類的概念但是js沒有類這個概念,因此它的對象和基于類的語言中的對象有所不同。

? ? ? ? 創(chuàng)建對象的方法:

var person = new Object();

person.name = "sulishi";

ES6簡潔方法:允許在對象中只寫屬性名,不寫屬性值這個時候?qū)傩灾稻褪菍傩悦淼淖兞?/p>

var foo =‘bar’

var baz = {foo};

屬性(property)類型

1.數(shù)據(jù)屬性

? ? ? ? ·[[Configurable]]:表示能否用delect刪除屬性或是能否修改屬性特性默認值為true

? ? ? ? ·[[Enumberable]]:能否通過for-in返回屬性 默認true

? ? ? ? ·[[Writable]]:能否修改屬性的數(shù)據(jù)值,默認undefined

? ? ? ? ·[[Value]]:包含這個屬性的數(shù)據(jù)值默認undefined

要修改屬性默認的特性必須用

Object.defineProperty()//vue的數(shù)據(jù)雙向綁定的核心也是這個

IE8是第一個實現(xiàn)object.definpProperty()方法的瀏覽器,但是有很多bug不建議在這個里面使用

2.訪問器屬性

? ? ·[[Get]]:讀取屬性時調(diào)用的函數(shù) 默認undefined·

? ? ·[[Set]]:寫入屬性時調(diào)用的函數(shù)? 默認undefined

訪問器屬性不能直接定義,必須使用和上面一樣的方法

eg:

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

get 和 set不一定非得同時指定getter和setter,只指定getter然意味著屬性是不能寫的

object.defineProperties()

利用這個方法可以通過描述符一次定義多個屬性。這個方法接收兩個對象參數(shù):第一個對象是要添加和修改其屬性的對象,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應(yīng)。

Object.getOwnPropertyDescriptor()

可以取得給定屬性的描述符。這個方法接收兩個參數(shù):屬性所在的對象和要讀取其描述符的屬性名稱。返回值是一個對象,如果是訪問器屬性,這個對象的屬性有 configurable、enumerable、get 和 set;如果是數(shù)據(jù)屬性,這個對象的屬性有 configurable、enumerable、writable 和 value。

工廠模式,構(gòu)造函數(shù)模式

原型模式

? ? 1.理解原型對象

? ? ? ? 只要創(chuàng)建新函數(shù),就會根據(jù)特定的規(guī)則給該函數(shù)創(chuàng)建一個prototype屬性,指向函數(shù)的原型對象。默認所有原型對象都會自動獲得一個constructor屬性


對象之間的關(guān)系

實現(xiàn)原型鏈基本模式

實現(xiàn)原型鏈的基本模式


實例以及構(gòu)造函數(shù)和原型之間的關(guān)系

call(),apply()

·call(xx)傳遞參數(shù)進行繼承

淺復(fù)制,深復(fù)制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容