1、prototype
? ? ? prototype屬性是每一個函數都具有的屬性,但是不是一個對象都具有的屬性旱幼。比如
?function F(){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}
var f = new F()查描;?
其中F中有prototype屬性,而 f 沒有柏卤。但是 f 中的隱含的__proto__屬性指向F.prototype冬三。
f.__proto__ === F.prototype
為什么會存在prototype屬性?
Javascript里面所有的數據類型都是對象缘缚,為了使JavaScript實現面向對象的思想勾笆,就必須要能夠實現‘繼承’使所有的對象連接起來。而如何實現繼承呢桥滨?通過new的方式來實現實例窝爪。
舉個例子弛车,child1,child2都是Mother的孩子,且是雙胞胎蒲每。
function Mother(name){
? ? ? ?this.name = name;
? ? ? ?this.father = '張三';
}
var child1 = new Mother('媽媽');
var child2 = new Mother('媽媽');
如果有一天纷跛,發(fā)現孩子的父親其實是李四,那么就要修改每一個孩子的father屬性邀杏。
child1.father ='李四';
console.log(child2.father) //?張三
也就是說修改了其中一個孩子的father屬性不會影響到下一個贫奠,屬性的值無法共享。
正是這個原因才提出來prototype屬性望蜡,把需要共享的屬性放到構造函數也就是父類的實例中去唤崭。
2、__proto__
__proto__屬性是每一個對象以及函數都隱含的一個屬性脖律。對于每一個含有__proto__屬性谢肾,他所指向的是創(chuàng)建他的構造函數的prototype。原型鏈就是通過這個屬性構件的状您。
想像一下勒叠,如果一個函數對象(也稱為構造函數)a的prototype是另一個函數對象b構建出的實例,a的實例就可以通過__proto__與b的原型鏈起來膏孟。而b的原型其實就是Object的實例眯分,所以a的實例對象,就可以通過原型鏈和object的prototype鏈接起來柒桑。
function a(){
}
function b(){
}
var b1 = new b();
a.prototype = b1;
var a1 = new a();
console.log(a1.__proto__===b1);//true
console.log(a1.__proto__.__proto__===b.prototype) //true
console.log(a1.__proto__.__proto__.__proto__===Object.prototype) //true
如果要理清原型和原型鏈的關系弊决,首先要明確一下幾個概念:
1.JS中函數也是對象, 而且是一種特殊的對象
2.JS中Object原型鏈的終點指向Object.prototype
3.JS對象都有一個隱藏的__proto__屬性,他指向創(chuàng)建它的構造函數的原型魁淳,但是有一個例外飘诗,Object.prototype.__proto__指向的是null。
4.JS中構造函數和實例(對象)之間的微妙關系
構造函數通過定義prototype來約定其實例的規(guī)格, 再通過 new 來構造出實例,他們的作用就是生產對象.
function Foo(){ }
var foo = new Foo();
foo其實是通過Foo.prototype來生成實例的界逛。
構造函數本身又是方法(Function)的實例, 因此也可以查到它的__proto__(原型鏈)
function Foo(){
}
等價于 var Foo= new Function()昆稿;
而Function實際上是
function Function(){
}
也就是等價于
var Function = new Function();
所以說Function是通過自己創(chuàng)建出來的息拜。正常情況下對象的__proto__是指向創(chuàng)建它的構造函數的prototype的.所以Function的__proto__指向的Function.prototype
Object 實際上也是通過Function創(chuàng)建出來的
typeof(Object) //function 所以溉潭,
function Object(){
} 等價于
var Object = new Function();
那么Object的__proto__指向的是Function.prototype,也即是
Object.__proto__ ===?Function.prototype?//true
下面再來看Function.prototype的__proto__指向哪里
因為JS中所有的東西都是對象少欺,那么喳瓣,Function.prototype 也是對象,既然是對象赞别,那么Function.prototype肯定是通過Object創(chuàng)建出來的畏陕,所以,
Function.prototype.__proto__ === Object.prototype //true