在javaScript創建對象壹文中提到過:用構造函數創建對象存在壹個問題即同壹構造函數的不同實例的相同方法是不壹樣的,所以我們用原型把構造函數中公***的屬性和方法提取出來進行封裝,達到讓所有實例***享的目的。
function定義的對象有壹個prototype屬性,prototype屬性又指向了壹個prototype對象。在prototype對象中有壹個constructor屬性,這個constructor屬性同樣指向壹個constructor對象,而這個constructor對象恰恰就是這個function函數本身。
用偽代碼表示如下:
var function{
prototype:prototype{
constructor:constructor == function
}
}函數與原型的關系
js中創建壹個函數,就會自動創建壹個prototype屬性,這個屬性指向函數的原型對象,並且原型對象會自動獲得壹個constructor(構造函數)屬性,指向該函數。
舉例:以前面的原型模式創建對象為例說明
<script type="text/javascript">
function Person(){
}
Person.prototype.name="lxy";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
}
var lxy=new Person();
lxy.sayName();
var personA=new Person();
personA.sayName();
alert(lxy.sayName()==personA.sayName());//true
</script>實例與原型的關系
通過構造函數創建壹個實例,該實例內部將包含壹個屬性(指針),指向構造函數的原型對象。
舉例:Person構造函數的實例Person1和Person2的[[Prototype]]屬性都指向Person的原型。
Note:[[Prototype]]連接是存在於實例和構造函數的原型之間,而不是存在實例與構造函數之間。
關於這個指針,ECMA-262中叫[[Prototype]],沒有標準的方式訪問[[Prototype]],但Firefox、Safari和Chrome在每個對象上都支持壹個屬性__protp__,而在其他實現中,這個屬性對腳本不可見。