面向對象與原型

原型概念:javascript

      咱們建立的每一個函數都有一個prototype(原型)屬性,這個屬性是一個對象,它的用途是包含能夠由特定類型的全部實例共享的屬性和方法。邏輯上能夠這麼理解,prototype經過調用構造函數而建立的那個對象的原型對象。使用原型的好處可讓全部對象實例共享它所包含的屬性和方法。也就是說,沒必要在構造函數中定義對象信息,而是能夠直接將這些信息添加到原型中。java

function Box(name,age){
 this.name=name;       //實例屬性
 this.age=age;
 this.run=function(){  //實例方法
  return this.name+this.age+'運行中。。。'
 }
}


//原型
function Box(){}
Box.prototype.name='lee';
Box.prototype.age=100;
Box.prototype.run=function(){
 return this.name+this.age+'運行中。。。'
}
var box1=new Box();
var box2=new Box();
alert(box1.run==box2.run)  //true
//若是是實例方法,不一樣的實例化,他們的方法地址是不同的,是惟一的
//若是是原型方法,那麼他們地址是共享的,你們都是同樣

alert(box1.prototype)  //這個屬性是一個對象,訪問不到函數

alert(box1.__proto__) //這個屬性是一個指針指向prototype原型對象this

 

alert(box1.constructor)  //構造屬性,能夠獲取構造函數自己prototype

                                 //做用是被原型指針定位,而後獲得構造函數自己指針

                                 //其實就是對象實例對應原型對象的做用,鏈接做用code

 

 原型模式的執行流程:對象

1,先查找構造函數實例裏的屬性和方法,若是有,馬上返回ip

2,若是構造函數實例裏沒有,則去它的原型對象裏找,若是有,就返回原型

雖然咱們能夠經過對象實例訪問保存在原型中的值,但卻不能訪問經過對象實例重寫原型中的值 

 

<1 判斷實例中是否有屬性

box1.hasOwnProperty('name');   

<2 // in 只要有的就會返回,判斷無論實例仍是原型裏,只要有就是true

alert('name' in box1);

<3 如何判斷只有原型裏有

//判斷只有原型裏有name
function isProperty(object,property){
 return !object.hasOwnProperty(property)&& (property in object)
}

alert(isProperty(box1,'name'))

function Box(){}

var box=new Box();

//alert(box.prototype);    //使用對象實例沒法訪問到prototype

//alert(box.__proto__);    //使用對象實例訪問prototype的指針 

alert(Box.prototype)      //使用構造函數名(對象名)訪問prototype

相關文章
相關標籤/搜索