JavaScript的所有數(shù)據(jù)都可以看成對象,那是不是我們已經(jīng)在使用面向?qū)ο缶幊塘四兀?br> 當然不是吼肥。如果我們只使用Number乌叶、Array、string以及基本的{...}定義的對象讯私,還無法發(fā)揮出面向?qū)ο缶幊痰耐Α?br> JavaScript的面向?qū)ο缶幊毯痛蠖鄶?shù)其他語言如Java热押、C#的面向?qū)ο缶幊潭疾惶粯印H绻闶煜ava或C#斤寇,很好桶癣,你一定明白面向?qū)ο蟮膬蓚€基本概念:
- 類: 類是對象的類型模板,例如娘锁,定義Student類來表示學生牙寞,類本身是一種類型,Student表示學生類型莫秆,但不表示任何具體的某個學生间雀;
- 實例:實例是根據(jù)類創(chuàng)建的對象,例如镊屎,根據(jù)Student類可以創(chuàng)建出xiaoming惹挟、xiaohong、xiaojun等多個實例杯道,每個實例表示一個具體的學生匪煌,他們?nèi)紝儆赟tudent類型。
所以党巾,類和實例是大多數(shù)面向?qū)ο缶幊陶Z言的基本概念萎庭。
不過,在JavaScript中齿拂,這個概念需要改一改驳规,JavaScript不區(qū)分類和實例的概念,而是通過原型(prototype)來實現(xiàn)面向?qū)ο缶幊獭?br>
原型是指當我們想要創(chuàng)建xiaoming這個具體的學生時署海,我們并沒有一個Student類型可用吗购。那怎么辦医男?恰好有這么一個現(xiàn)成的對象:
var robot = {
name: 'Robot',
height: 1.6,
run: function () {
console.log(this.name + ' is running...');
}
};
我們來看看robot對象有名字,有身高捻勉,還會跑镀梭,有點像小明,干脆就根據(jù)它來“創(chuàng)建”小明得了踱启!
于是我們把它改名為Student报账,然后創(chuàng)建出xiaoming:
var Student = {
name: 'Robot',
height: 1.2,
run: function() {
console.log(this.name + ' is running...');
}
};
var xiaoming = {
name: '小明'
};
xiaoming_proto_= Student;
注意最后一行代碼是把xiaoming的原型指向了對象Student,看上去xiaoming仿佛是從Student繼承下來的:
xiaoming.name; // '小明'
xiaoming.run(); // 小明 is running...
xiaoming有自己的name屬性埠偿,但并沒有定義run()方法透罢。不過,由于小明是從Student繼承而來冠蒋,只要Student有run()方法羽圃,xiaoming也可以調(diào)用:
JavaScript的原型鏈和Java的Class區(qū)別就在,它沒有"Class"的概念抖剿,所有對象都是實例朽寞,所謂繼承關(guān)系不過是把一個對象的原型指向另一個對象而已。
如果你把xiaoming的原型指向其他對象:
var Bird = {
fly: function () {
console.log(this.name + 'is flying...');
}
};
xiaoming.__proto__ = Bird;
現(xiàn)在xiaoming已經(jīng)無法run()了牙躺,他已經(jīng)變成了一只鳥:
xiaoming.fly(); // 小明 is flying...
在JavaScript代碼運行時期愁憔,你可以把xiaoming從Student變成Bird,或者變成任何對象腕扶。
<u>請注意</u>孽拷,上述代碼僅用于演示目的。在編寫JavaScript代碼時半抱,不要直接用obj.proto去改變一個對象的原型脓恕,并且,低版本的IE也無法使用proto 窿侈。Object.create()方法可以傳入一個原型對象,并創(chuàng)建一個基于該原型的新對象史简。但是新對象什么屬性都沒有乃秀,因此圆兵,我們可以編寫一個函數(shù)來創(chuàng)建xiaoming :
// 原型對象:
var Student = {
name: 'Robot',
height: 1.2,
fun: function() {
console.log(this.name + 'is running...');
}
};
function createStudent(name) {
// 基于Student原型創(chuàng)建一個新對象:
var s = Object.create(Student);
// 初始化新對象:
s.name = name;
return s;
}
var xiaoming = createStudent('小明');
xiaoming.run(); // 小明 is running...
xiaoming.__proto__ === Student; // true
這是創(chuàng)建原型繼承的一種方法,JavaScript還有其它方法來創(chuàng)建對象殉农,我們在后面會一一講到刀脏。