一、首先建立js物件的四種方式:
1.普通模式
varperson
=new
object();
person.name="
irving";
person.age=22
;person.sayhi
=function
()
但是這樣每次去建立乙個類的物件相當的麻煩。所以有了下面的集中建立物件的模式。
2.工廠模式
functionperson(name,age);
return
p;}
這樣就建立一乙個person類(並不是真正意義上的方法,其實我們能看到,它只不過是乙個方法,乙個object的物件的例項而已,裡面所謂的屬性,只不過是以object特有的鍵值對的形式存在)。
varp1 =
person(
"irving",
22);
varp2
=person(
"irving",
26);
p1.sayhi();
p2.sayhi();
這個結果,應該猜都能猜出來。
3.建構函式模式
functionperson(name,age);
}var
p1 =
newperson(
"irving",
22);
varp2
=new
person(
"irving",
26);
p1.sayhi();
p2.sayhi();
new關鍵字:
4.原型模式,其實上面的集中方法都有大家看不到的缺陷。
每個例項上都有自定義的各個方法物件,這樣多個物件呼叫這個方法的時候就消耗記憶體資源。我們在想能不能讓同乙個類的物件都區呼叫同乙個方法物件。這樣就不會占用那麼多的記憶體空間。
好,這個時候prototype的好處就體現了。
functionperson(name,age)
person.prototype.sayhi
=function
()var
p1 =
newperson(
"irving",
22);
varp2
=new
person(
"irving",
26);
p1.sayhi();
p2.sayhi();
二、繼承
1.方法的繼承,首先用原型模式建立乙個父類。
functionperson(name,age)
person.prototype.sayhi
=function
()
2.建立子類,
functionstudent()
student.prototype
=person.prototype;
varstu
=new
person();
如何判斷stu繼承了person?只要stu能點出sayhi這個方法出來就證明stu能夠呼叫這個方法,也就是說繼承了這個方法。
stu.sayhi();很顯然的能點出來,執行的話,會彈出undefinde,既然彈出了,就證明方法執行了,方法執行了就證明方法繼承過來的,至於彈出的我們下面來解決。//這樣子類student就能夠繼承父類的方法。
我們更改下這個子類的建構函式
functionstudent()
functionstudent(name, age)
好吧,我們看下完整的**。
functionperson(name, age)
person.prototype.sayhi
=function
() function
student(name, age)
student.prototype
=person.prototype;
varstu
=new
student(
"irving",
"23");
stu.sayhi();
這樣我們的繼承問題就解決了。
student.prototype=person.prototype;
這個**是把person的原型指標賦給了student的原型,也就是說我們給student.prototype新增乙個屬性的時候,父類person也會具有這個屬性。
student.prototype.eat但是=function
() var
per
=new
person(
"irving",
23);
per.eat();
varper
=new
person(
"irving",
23);
per.eat();
這個**必須放在
student.prototype.eat=function
()
之後,因為**是從上到下執行的。
在沒有給原型指標新增屬性方法的時候是沒辦法訪問到的。
上述的**也就是說我們在給子類新增方法的時候,我們父類也有了這些方法,但是理論上來說對於繼承是不允許這樣的。
那麼我們怎麼對子類新增方法而不會使父類也擁有這些方法呢。
我們看一下,stu呼叫sayhi方法是怎麼執行的。
首先建立乙個stu的物件,在棧上儲存這個變數stu,在堆上儲存new出來的物件,stu這個變數指向堆上物件的位址。當我們呼叫stu的sayhi方法時,首先會到student這個物件去找方法,找不到這個方法,然後去原型裡面去找, 由於這個方法的原型實質上是person類的原型的位址。所有就到person類中區找,找到了就呼叫這個方法。
如果我們將子類的原型指向父類的物件呢?
student.prototype=new
person();
這就是所謂的原型繼承。
functiona()function
b()return
aobj;
}var
bobj
=new
b();
bobj.getx();
js中的物件導向
很火的一張圖很生動形象 mdn 給了我們一堆術語 請嘗試理解物件導向,並背誦 mdn 裡的以下內容 class 類 定義物件的特徵。它是物件的屬性和方法的模板定義.object 物件 類的乙個例項。property 屬性 物件的特徵,比如顏色。method 方法 物件的能力,比如行走。constru...
js中的物件導向。
1.js中的物件導向就是類,而類中關鍵的就是繼承 2.首先宣告乙個類 var gandparent function 3.建構函式實現繼承 function grandparent grandparent.prototype.say function function son console.log...
js中物件導向的繼承
參考 繼承 缺點 修改子類dog.prototype的同時也影響到了父類的animal.prototype 物件導向的拷貝繼承 上面 只是用了淺拷貝實現了物件的繼承,jquery中就是利用了拷貝繼承。function extend c,p if typeof p object else if win...