一.在瞭解原型以前須要提早了解的。
1.工廠模式:建立一個函數,用特定的接口建立對象的細節。函數
//如今要建立兩個包含 「name」和「age」的對象, let tom ={name:"Tom",age:16} let lily = { name : "Lily",age:18} ……//所示數量足夠具大 ,對象足夠大 ,會花費大量的時間。下面的工廠模式能 很好的解決這一問題
//工廠的就是隻流水線不是全部都是要人工,節約人力成本。 function person(name,age){ let obj = {}; //建立一個對象 ; obj.name = name ; //爲對象添加細節 obj.age = age ; obg.sayHello= function (){ alert ("Hello"+this.name) }; return obj;} //返回這個對象 let tom = person("Tom",16); let lily = person("Lily",18)
2.構造函數:自定義構造函數,能夠自定義對象類型的屬性和方法。this
function Person(name,age){ this.name = name ; //爲對象添加細節 this.age = age ; this.sayHello= function (){ alert ("Hello"+this.name) }; let tom = new Person("Tom",16); let lily =new Person("Lily",18)
①
建立了一個對象;②
將this
指向這個對象;③
返回這個對象;constructor
(構造函數),指向Person
;這就是能夠經過constructor
判斷對象類型的原理。二.原型模式
1.以下,與構造函數模式不一樣的是,原型模式的每一個實例都是訪問同一屬性同一函數,,函數不用從新建立。spa
function Person () { this.x = 100; } Person.prototype.name = 'Tom'; Person.prototype.age = 18; Person.prototype.sayHello = function (){ alert(`Hello${this.name}`) } let Tom = new Person() Tom.sayHello()
2.原型對象prototype
prototype
,是一個對象,這個函數指向函數的原型對象;prototype
這個對象上,自帶一個屬性,constructor
指向當前這個類;③當爲實例添加屬性時,這個屬性會屏蔽原型對象中保存的同名屬性,可是事實阻止訪問,並無修改那個屬性,若將同名的實例屬性設置爲null
,一樣會屏蔽,可是若用delete
,則能夠刪除實例屬性,能夠從新訪問原型中的屬性。3d
alert(Tom.age); //18 let Tom.age = 20; alert(Tom.age); //20 delete Tom.age; alert(Tom.age); //18
this
都是實例。爲何私有屬性(來自實例的屬性)的查找等級要高呢?這就涉及到原型鏈。3.原型鏈:每一個對象數據類型(普通對象,prototype
,實例)都有一個屬性,叫作__proto__
;code
console.log(Tom.age)
的查找過程是怎樣的呢?①首先在私有空間內查找age屬性,私有空間的屬性包括自身的屬性和從類那裏繼承的屬性,__proto__
去當前實例所屬類的原型上進行查找,找到的話,說明是共有屬性;__proto__
去當前實例所屬類的原型進行查找,找不到將繼續經過__proto__
一直找到Object
。 ①
表明Person
的原型對象;曲線②
中,實例Tom
經過__proto__
指向Tom
所屬類(Person
)的原型(Person Prototype
);曲線③中,Person的原型對象經過__proto__
找到Person
對象的所屬類,也就是Object
(函數也是對象類,萬物皆對象),指向它的原型(ObjectPrototype
) ;曲線5
中,指向Obeject
所屬類的原型,它的類就是它本身,因此此時不在有__proto__
整個屬性查找結束,這就是原型鏈的查找過程。⑤經過hasOwnProperty
來判斷屬性,這個方法就是經過④中的查找過程,在基類Object
中找到的。 判斷屬性是否在對象上「name」 in Tom
,其中in
的查找過程也是經過上述的查找過程。對象
function hasPrototypeProperty(object,attr){ return !object.hasOwnProperty(attr) && (attr in object);}
4.關於原型須要注意的幾點blog
①使用簡單原型語法的時候,注意constructor
的指向問題,繼承
Person.prototype={ //此時constructor指向Object構造函數 name : 'Tom', age:18 } Person.prototype={ //此時constructor指向Person constructor:Person, name : 'Tom', age:18 }