prototype 原型的學習

2017年4月18日09:01:32
原型:prototype (面向對象)
prototype:在js中,任何一個函數,都有一個prototype屬性,指向一個對象,輸出這個函數的prototype屬性,你會發現一個空對象,輸出這個prototype的類型是一個object。
1:原型做用:一個函數的原型,對於普通函數,沒有做用,可是若是函數是一個構造函數,name函數的原型,有很是大的做用,具體以下
        //當一個函數被new出來的時候,不單單執行了構造函數裏面的語句,也會把這個函數的proto——(原型對象)指向構造函數的proto。
        var xiaoming = new People();
        console.log(xiaoming.__proto__);
        console.log(xiaoming.__proto__==People.prototype);
        // 當咱們訪問那麼,age的時候,構造函數返回的對象自己沒有,那麼就去查找原型,原型若是有就拿來當作本身的屬性。
        console.log(xiaoming);
prototype必定使函數的屬性。只能使用函數名調用賦值,當這個函數是一個構造函數的時候,那麼new出來的對象將以他的原型那個對象爲new出來的實例的原型對象。
任何一個對象都有__proto__屬性,這個只是chrome的屬性,別的不兼容,別的瀏覽器不能經過__proto__進行訪問.
原型查找:是js裏面很重要的一個機制。當咱們要訪問一個對象自己的屬性的時候,若是這個對象身上有這個屬性,直接返回值,若是沒有這個屬性,將訪問它的原型對象。
prottype:原型,構造函數的屬性,只有函數有原型。
__proto__原型對象,任何對象都有原型對象。:
那麼__proto__是什麼?咱們在這裏簡單地說下。每一個對象都會在其內部初始化一個屬性,就是__proto__,當咱們訪問一個對象的屬性時,若是這個對象內部不存在這個屬性,那麼他就會去__proto__裏找這個屬性,這個__proto__又會有本身的__proto__,因而就這樣一直找下去,也就是咱們平時所說的原型鏈的概念。
按照標準,__proto__是不對外公開的,也就是說是個私有屬性,可是Firefox的引擎將他暴露了出來成爲了一個共有的屬性,咱們能夠對外訪問和設置。
2:原型的用途:
原型優勢
若是不用原型,那麼new的時候每個對象都會複製一份構造函數裏面的屬性,多個對象會佔用很大的內存。若是使用原型設置屬性,全部對象都只調用一個函數,能夠節省空間。
3:原型鏈查找
1)constructor:函數的原型有constructor屬性,是原型的屬性,這個屬性值是原型的構造函數,
原型是實例的原型對象,構造函數是構造函數的原型構造器,經過構造函數才創造出一個構造函數的原型,構造函數的原型是一個對象,經過new函數製造出來的實例化對象的原型都是構造函數的原型
構造函數《==》原型
object用於創造對象,它是系統內置的構造函數,object。prototype是全部對象的原型鏈終點,因此當使用對象點語法調用某個函數的時候,系統會沿着原型鏈尋找定義,一直到Object。prototype
數組的原型鏈:
JS在建立對象(不管是普通對象仍是函數對象)的時候,都有一個叫作__proto__的內置屬性,用於指向建立它的函數對象的原型對象prototype。
在js中,面向對象技術,已經變成了組織代碼的方式,這種方式叫作組件開發。
繼承:
          //函數不調用不會本身執行
            // 把人類的全部屬性給了學生類
            this.constructor.apply(this,arguments);
            this.xuehao = xuehao;
            this.flowernum = flowernum;
        }
        //繼承的核心語句
        // 把人類的方法給了學生類
        Student.prototype = new People();
        // 下面這種狀況會改變父類原型中的相同方法
        // Student.prototype = People.prototype;(不建議使用)。
for,,in 循環能夠將原型鏈上全部能夠枚舉的東西列舉出來。for(var k in obj)
in運算返回的是一個布爾值,系統默認例如constructor等屬性是不可枚舉的。for   in能夠把本身添加的屬性羅列起來,也能夠將原型鏈上全部的屬性羅列。
hasOwnProperty用來驗證這個屬性在不在當前obj裏面,不會順着原型鏈爬。只能輸出當前在這個obj裏面的。
直接使用點語法判斷屬性是否是在obj裏面若是是underfined說明不在。 不然返回屬性值。點語法會遍歷原型鏈
instanceof運算符
類:class
實例:instance   A instanse B 驗證A是否是B的實例
//數組的構造函數自帶的方法 (ie9以後開始兼容)ECMAScript5標準中新增的一個API驗證數組。
        var arr = [];
        console.log(arr instanceof Array);//true
        console.log(typeof arr);//object
        console.log(arr instanceof Object);//true
        console.log(Array.isArray(arr));//true
運算機理:
遍歷HelloKit這個對象原型鏈上的每一個原型對象,若是遍歷到這個原型對象是某個構造函數的Prototype,那麼hellokit也是這個構造函數的實例。
 
在典型的面向對象的語言中,如java,都存在類(class)的概念,類就是對象的模板,對象就是類的實例。可是在Javascript語言體系中,
是不存在類(Class)的概念的,javascript中不是基於‘類的’,而是經過構造函數(constructor)和原型鏈(prototype chains)實現的。
 所謂屬性,就是對象的一種狀態;所謂方法,就是對象的一種行爲。
Cat.prototype = new Dog();cat繼承了dog的屬性。
相關文章
相關標籤/搜索