一.原型鏈指針(__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