天天看點

javascript之原型

原型

每個函數都有一個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