javascript對象---3 原型鏈

一.原型鏈指針(__prototype__)的特色瀏覽器

1.原型對象(prototype): (本質是一個對象,每個函數在建立函數時,都是由Function這個對象產生一個原型對象,而後經過指針的方式賦給對象)是函數對象的一個內部屬性,值是一個簡單的對象,用戶能夠訪問,操做 該對象,能夠向原型對象裏面添加屬性、方法。函數

2.原型鏈(__proto__): 每一個對象都具有的,不可訪問的內部屬性(指針)(chorm等瀏覽器能夠訪問,但沒法操做),指針指向 構造函數 對應的原型對象。(開發人員不能動);每建立一個對象,執行了一次構造函數spa

,有一個指針指向原型對象。prototype

3.原型鏈的特色:指針

原型鏈的終點是 Object對象 的 prototype 屬性,該屬性的 __proto__爲null ,  全部的連接構成原型鏈。orm

原型鏈是一個從頭至尾連接的閉環。對象

原型鏈的做用:繼承

使用原型鏈能夠模擬類的功能。內存

使用原型鏈能夠實現繼承關係。原型鏈

二.原型對象(prototype)的建立:

在預編譯或執行匿名函數時,由JS引擎調用 new Function( ) 建立函數對象,以及函數對象的 prototype 對象。只有函數對象纔有 prototype 屬性。

 

function Fun(){  //函數在JS中也是對象
                 
            }
            //function fun()   以上代碼,在預編譯階段至關於下面一句
            var Fun =new Function(); //這句代碼就是 function fun()的過程 

 

棧內存中,在預編譯階段已經存在 Object  Function, 首字母大寫

Object . toString(); //返回函數定義和函數體

Object : function Object( );  //一個function對象

Function:  function Object( );  //一個function對象

在程序加載前,內存中已經存在

function Object(){

}

function Function(){

}

在預編譯階段至關於定義了兩個變量  

var Object = new Function();    //Object是一個特殊的瀏覽器本身建立的構造函數

var Function = new Function() ;//兩個 Function 左側和右側的Function相同

在預編譯階段,會加載兩個構造函數    Object : 特殊函數,表明對象函數         Function : 函數對象,自省的(本身調用本身建立本身)    var Function = new Function()

下一個問題

1.    var obj = {  //全局變量1 實際值爲 object
                name : "ads";
            }

2. var obj =new Object();   obj.name="ads";

1. 和 2. 兩個程序是同樣的

任何一個對象都有原型鏈屬性,只有函數對象有原型屬性.

 

Object.prototype 的原型鏈 的原型指針指針是最終點。爲空,全部對象均可以訪問Object.prototype內的方法

Function.prototypre = new Object();

原型鏈的內部結構,鏈接方式

prototype 不起到原型鏈的做用,是指向原型對象的一個指針。__proto__:將原型鏈鏈接起來

 

三.原型對象(prototype)的默認屬性(不要對prototype直賦值,會覆蓋默認屬性,致使原型鏈錯誤)

function Fun(){  //函數在JS中也是對象
                 
            }
            debgger; 

這裏Fun原型對象中有兩個屬性  Fun.prototype : Object               constructor :function Fun( )         __proto__ : Object
            Fun.prototype = {
                name = 'zhang',
                age:11
            }

由於從新對原型對象賦值,  Fun.prototype : Object    age : 11   name : "張三「  __proto__ : Object  constructor不見了

1. __proto__:prototype對象的原型鏈。

2.constructor:構造器指針,指向構造函數對象。

四. 修改原型對象的屬性:

Fun.prototype.attribute = value; //擴展屬性

Fun.prototype.FunName = function(){} ;  // 擴展函數 

修改範例

Fun.prototype.name="zhang";
Fun.prototype.sayhello = function(){
                console.log("hello");
   }

至關於在

Fun.prototype{

name : 」張三「,

sayhello :function

}

 

function Fun(){  //函數在JS中也是對象
                 
 }
        
            Fun.prototype.name="zhang";
            Fun.prototype.sayhello = function(){
                console.log("hello");
            }
            var fun =new Fun();

            var fun1 =new Fun();
            fun.sayhello();  //至關於繼承   原型鏈指針指向構造函數的原型對象

             fun1.sayhello( ) ;也能夠  都是繼承構造函數的方法,屬性

Fun.prototype{   / /fun的原型對象

__proto__ : null  ;

constructor;  //指向他的構造函數,誰建立他指向誰   指向誰  Fun()

}

Fun :new Function{

prototype :

     _proto__ ;

}

constructor不影響原型鏈,做用,在原型對象(prototype)中能夠訪問構造函數,只有prototype屬性中有constructor,其他對象沒有。

擴展原型對象可擴展函數的方法。

五。原型鏈指針(__prototype__)的特色

1.不可訪問性:在IE等瀏覽器__protoype__屬性不可訪問。

2.不可操做性,不能修改原型鏈指針的指向  Fun.__proto__=  //不能夠這樣寫 

3.多元性:全部對象類型,(包括Function)都包含原型鏈指針。

4.鏈接性:對象的原型鏈指針默認指向 構造函數 的prototype對象。但 prototype 對象的 __proto__ 也會做爲原型鏈的一部分,直到鏈接到Object prototype 對象。object原型對象中__proto__爲null

5.通用性:在原型鏈上全部的 prototype  對象中的屬性和函數,對象均可以訪問調用。

6.檢測上級原型鏈的方式:

instanceof  例如: Fun instanceof  Function  //true

fun instanceof Fun //true  fun是由Fun建立出的, Fun的原型鏈在 fun以前(上).

Function instanceof Object //true

Fun.prototype . isPrototypeOf  (fun)  //檢測Fun的prototype是不是 fun 原型鏈上的一環  (此方法來自 Object的prototype 擴展 true,  只能檢測 緊接着的兩個原型鏈指針,fun指向 Fun的prototype

相關文章
相關標籤/搜索