prototype與 _proto__的關係

prototype與 __ proto__ 都是在這個過程當中催生的產物,咱們一下子立刻討論,在這之...作對象便可,那javascript種到底是經過什麼來明確繼承關係的呢。javascript

 

1、構造函數:java

構造函數:經過new關鍵字能夠用來建立特定類型的對象的函數。好比像Object和Array,二者屬於內置的原生的構造函數,在運行時會自動的出如今執行環境中,能夠直接使用。以下:瀏覽器

var arr = new Array();//使用Array構造函數建立了一個array實例arr
arr[0]="a";
arr[1]="b";
alert(arr);//a,b
var obj=new Object();//使用Object構造函數建立了一個Object實例obj
obj.name="c";
obj.age=12;
alert(obj.name);//c

咱們能夠自定義的建立構造函數,併爲其自定義屬性和方法,如:函數

//建立構造函數Person
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name)//
};
}
//使用new關鍵字,來生成Person實例
var person1=new Person("Tom",22);
var person2=new Person("Jerry",21);
person1.sayName();//Tom
person2.sayName();//Jerry

注意如下幾點:this

  • 構造函數的名字始終要以大寫字母開頭(主要是爲了區別於非構造函數,也便是區別於普通函數)
  • 構造函數也就是函數,定義構造函數和定義普通函數的語法同樣。構造函數和普通函數的區別在於:使用他們的方式不一樣。任何函數只要使用new操做符來調用,那他就能夠做爲構造函數;不使用new操做符來調用就是普通函數
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name)//
};
}
//當作構造函數使用
var person=new Person("Tom",22);
person.sayName();//Tom
//當作普通函數使用
Person("Jerry",30);//添加到window
sayName();//Jerry 等同於window.sayName();

2、原型對象:prototype

每一個函數都有一個prototype屬性,它是一個指向原型對象的指針,原型對象在定義函數時同時被建立,原型對象的用途是包含全部實例共享的屬性和方法指針

function Person(){
}
//自定義原型對象的屬性和方法
Person.prototype.name="Tom";
Person.prototype.age=25;
Person.prototype.sayName=function(){
alert(this.name);
};
//原型對象中的全部屬性和方法 都會自動被全部實例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom

只要建立了一個新函數,每一個函數在建立以後都會得到一個prototype的屬性,這個屬性指向函數的原型對象(原型對象在定義函數時同時被建立),此原型對象又有一個名爲「constructor」的屬性,反過來指向函數自己,達到一種循環指向,對象

如在上邊的例子中:alert(Person.prototype.constructor===Person);//會返回trueblog

function Person(){}
alert(Person.prototype.constructor===Person);//true

3、proto(注意這裏proto左右兩邊都有兩個"_")繼承

當調用構造函數建立一個新實例後,該實例的內部將包含一個指針[[Prototype]],該指針指向建立它的構造函數的原型,在腳本上沒有標準的方法來訪問[[Prototype]],但大多數瀏覽器都支持經過proto來訪問。

function Person(){
}
//自定義原型對象的屬性和方法
Person.prototype.name="Tom";
Person.prototype.age=25;
Person.prototype.sayName=function(){
alert(this.name);
};
//原型對象中的全部屬性和方法 都會自動被全部實例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom
alert(person1.__proto__===Person.prototype);//true

 

揭祕Javascript中prototype與 _proto__的關係

 

總結:

①只要建立了一個函數,該函數的原型對象也隨之同時被建立出來,原型對象中的屬性和方法被經由其相對應的構造函數所建立的實例所共享

②每一個函數在建立以後都會得到一個prototype的屬性,這個屬性指向該函數的原型對象

③每一個對象的proto屬性都指向其構造函數的原型

相關文章
相關標籤/搜索