1.javascript原型
1.1.函數(shù)的原型對象
我們創(chuàng)建一個函數(shù),瀏覽器就會為我們在內存中創(chuàng)建一個原型對象,每個函數(shù)默認會
有一個prototype屬性,這個prototype就指向這個函數(shù)的原型對象,這個原型對象就
函數(shù)的原型,同時這個原型對象里面會有一個constructor屬性,這個constructor屬性
指向的就是這個函數(shù)(可以理解為原型對象是類,函數(shù)是構造方法)。
1.2.原型模型創(chuàng)建對象的缺陷
原型中的所有屬性都是共享的,同一構造創(chuàng)建的對象,去訪問原型中的屬性,每個
對象訪問的都是同一個屬性,但每個對象的屬性都是不一樣的,但是對于方法來說
但是,這個共享特性對 方法(屬性值是函數(shù)的屬性)又是非常合適的。
1.3.構造函數(shù)模型創(chuàng)建對象的缺陷
在構造函數(shù)中添加的屬性和方法,每個對象都有自己獨有的一份,大家不會共享。
這個特性對屬性比較合適,但是對方法又不太合適。因為對所有對象來說,他
們的方法應該是一份就夠了,沒有必要每人一份,造成內存的浪費和性能的低下。
1.4.使用組合模式解決上述兩種缺陷
原型模式適合封裝方法,構造函數(shù)模式適合封裝屬性,綜合兩種模式的優(yōu)點就有了
組合模式。
<script type="text/javascript">
//在構造方法內部封裝屬性
function Person(name, age) {
this.name = name;
this.age = age;
}
//在原型對象內封裝方法
Person.prototype.eat = function (food) {
alert(this.name + "愛吃" + food);
}
Person.prototype.play = function (playName) {
alert(this.name + "愛玩" + playName);
}
var p1 = new Person("李四", 20);
var p2 = new Person("張三", 30);
p1.eat("蘋果");
p2.eat("香蕉");
p1.play("志玲");
p2.play("鳳姐");
</script>
1.5動態(tài)原型模式創(chuàng)建對象
前面講到的組合模式,也并非完美無缺,有一點也是感覺不是很完美。把構造方法
和原型分開寫,總讓人感覺不舒服,應該想辦法把構造方法和原型封裝在一起,所
以就有了動態(tài)原型模式。動態(tài)原型模式把所有的屬性和方法都封裝在構造方法中,
而僅僅在需要的時候才去在構造方法中初始化原型,又保持了同時使用構造函數(shù)
和原型的優(yōu)點。
<script type="text/javascript">
//構造方法內部封裝屬性
function Person(name, age) {
//每個對象都添加自己的屬性
this.name = name;
this.age = age;
/*
判斷this.eat這個屬性是不是function,如果不是function則證明是第一次創(chuàng)建對象,
則把這個funcion添加到原型中。
如果是function,則代表原型中已經有了這個方法,則不需要再添加。
perfect!完美解決了性能和代碼的封裝問題。
*/
if(typeof this.eat !== "function"){
Person.prototype.eat = function () {
alert(this.name + " 在吃");
}
}
}
var p1 = new Person("志玲", 40);
p1.eat();
</script>
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。