原型
每個函數都有一個prototype屬性,它是一個對象,也稱作原型對象,可以将方法和屬性寫在它上面,而通過這個函數建立出來的執行個體對象,都能共享這個原型對象下的方法和屬性。隻需要将想要共享的東西放在該函數的prototype下,不想共享的東西通過構造函數建立
function CretePerson(name){
this.name=name;
}
CreatePerson.prototype.showName=function(){
alert(this.name);
}
var p1=new CretaePerson('hah');
p1.showName();
var p2=new CretaePerson('hehe');
p2.showName();
alert(p1.showName==p2.showName);//true,可見showName()方法共享,共用一個記憶體,當更改了p1的showName也會影響p2的showName
proto屬性
每個執行個體化對象都有proto屬性,它是一個指針,指向函數的prototype,也就是儲存了它的位址(JS中任何對象的值都是儲存在堆記憶體中,我們聲明的變量隻是一個指針,儲存了這個對象的實際位址,是以有了位址就能找到對象)
proto屬性儲存了構造函數的原型對象的位址,通過這個屬性就可以擁有原型對象下的所有屬性和方法,proto屬性實際就是執行個體化對象和原型對象之間的連接配接
原型鍊
每個函數都可以成為構造函數,每個函數都有原型對象,每個原型對象也可以是一個執行個體化對象
例如:建立了一個函數fun,它是構造函數function的執行個體化對象,而function的原型對象,又是Object的執行個體對象。是以fun有個proto屬性可以通路到function的原型對象,function原型對象也是個執行個體對象,也有個proto屬性,可以通路到Object的原型對象,是以通過proto屬性就形成了一條原型鍊。
每個執行個體化對象都可以通路到鍊子上方的方法和屬性,是以fun是可以通路Object原型對象下的方法和屬性的,實際上所有對象都可以通路Object的原型對象。
通路規則:先在自身的下面尋找,再去一級一級的往原型鍊上找
function Aaa(){}
Aaa.prototype.num=;
var a1=new Aaa();
a1.num=;
alert(a1.num);//10
原型對象
原型對象下三種屬性:
1、原型對象所帶方法和屬性
2、constructor構造函數屬性 :每個函數的原型對象都有的預設屬性,指向函數。每個執行個體化對象本身是沒有constructor屬性的,他們下面預設隻有一個proto屬性,用來連接配接原型對象,而和構造函數本身是沒有直接聯系的,是以它的constructor是通路在原型對象上的,當原型對象的constructor變化了,執行個體化的constructor也會改變。如果這個對象本身既是原型對象又是執行個體化對象,就擁有constructor屬性,無需從原型對象上通路
3、proto屬性
function CreatePerson(name){
this.name=name;
}
CreatePerson.prototype.showName=function(){
console.log(this.name);
};
var p1=new CreatePerson('haha');
p1.showName();
console.log(p1.constructor);//來自CreatePerson.prototype
console.log(CreatePerson.prototype);//{showName:{},constructor:CreatePerson,_proto_:Object.prototype}
//可見原型對象儲存了:、自身添加的方法,、構造函數constructor,、_proto_(和上一層構造函數原型對象的連接配接)
console.log(CreatePerson.prototype.__proto__===Object.prototype);//true 這個原型對象本身又是Object的執行個體化對象,所有_proto_指向Object的原型對象
console.log(CreatePerson.prototype.__proto__===Object);// false 可見是和構造函數下原型對象的連接配接,不是構造函數
console.log(CreatePerson.prototype.constructor);//CreatePerson CreatePerson.prototype是Object執行個體化對象,也是原型對象,是以自身擁有constructor屬性
console.log(Object.prototype.__proto__); // null 原型鍊的終點是null
console.log(CreatePerson.__proto__); //function.prototype CreatePerson本身既是構造函數又是function的執行個體化對象,擁有_proto_屬性,指向function的原型對象
console.log(CreatePerson.constructor); // function 繼承自function.prototype
console.log(CreatePerson.prototype instanceof CreatePerson)//驗證是否在一條原型鍊上 false
原文:http://www.jianshu.com/p/845ad9b78201