原型概念: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