JavaScript之面向?qū)ο骭動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
JavaScript的所有數(shù)據(jù)都可以看成對(duì)象,那是不是我們已經(jīng)在使用面向?qū)ο缶幊塘四兀?/p>
當(dāng)然不是。如果我們只使用Number、Array、string以及基本的{...}定義的對(duì)象,還無(wú)法發(fā)揮出面向?qū)ο缶幊痰耐Α?/p>
JavaScript的面向?qū)ο缶幊毯痛蠖鄶?shù)其他語(yǔ)言如Java、C#的面向?qū)ο缶幊潭疾惶粯印H绻闶煜ava或C#,很好,你一定明白面向?qū)ο蟮膬蓚€(gè)基本概念:
1.類(lèi):類(lèi)是對(duì)象的類(lèi)型模板,例如,定義Student類(lèi)來(lái)表示學(xué)生,類(lèi)本身是一種類(lèi)型,Student表示學(xué)生類(lèi)型,但不表示任何具體的某個(gè)學(xué)生;
2.實(shí)例:實(shí)例是根據(jù)類(lèi)創(chuàng)建的對(duì)象,例如,根據(jù)Student類(lèi)可以創(chuàng)建出xiaoming、xiaohong、xiaojun等多個(gè)實(shí)例,每個(gè)實(shí)例表示一個(gè)具體的學(xué)生,他們?nèi)紝儆赟tudent類(lèi)型。
所以,類(lèi)和實(shí)例是大多數(shù)面向?qū)ο缶幊陶Z(yǔ)言的基本概念。
不過(guò),在JavaScript中,這個(gè)概念需要改一改。JavaScript不區(qū)分類(lèi)和實(shí)例的概念,而是通過(guò)原型(prototype)來(lái)實(shí)現(xiàn)面向?qū)ο缶幊獭?/p>
原型是指當(dāng)我們想要?jiǎng)?chuàng)建xiaoming這個(gè)具體的學(xué)生時(shí),我們并沒(méi)有一個(gè)Student類(lèi)型可用。那怎么辦?恰好有這么一個(gè)現(xiàn)成的對(duì)象:
var robot = { name: 'Robot', height: 1.6, run: function () { console.log(this.name + ' is running...'); } };
我們看這個(gè)robot對(duì)象有名字,有身高,還會(huì)跑,有點(diǎn)像小明,干脆就根據(jù)它來(lái)“創(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的原型指向了對(duì)象Student,看上去xiaoming仿佛是從Student繼承下來(lái)的:
xiaoming.name; // '小明' xiaoming.run(); // 小明 is running...
xiaoming有自己的name屬性,但并沒(méi)有定義run()方法。不過(guò),由于小明是從Student繼承而來(lái),只要Student有run()方法,xiaoming也可以調(diào)用:
JavaScript的原型鏈和Java的Class區(qū)別就在,它沒(méi)有“Class”的概念,所有對(duì)象都是實(shí)例,所謂繼承關(guān)系不過(guò)是把一個(gè)對(duì)象的原型指向另一個(gè)對(duì)象而已。
如果你把xiaoming的原型指向其他對(duì)象:
var Bird = { fly: function () { console.log(this.name + ' is flying...'); } }; xiaoming.__proto__ = Bird;
現(xiàn)在xiaoming已經(jīng)無(wú)法run()了,他已經(jīng)變成了一只鳥(niǎo):
xiaoming.fly(); // 小明 is flying...
在JavaScrip代碼運(yùn)行時(shí)期,你可以把xiaoming從Student變成Bird,或者變成任何對(duì)象。
請(qǐng)注意,上述代碼僅用于演示目的。在編寫(xiě)JavaScript代碼時(shí),不要直接用obj.__proto__去改變一個(gè)對(duì)象的原型,并且,低版本的IE也無(wú)法使用__proto__。Object.create()方法可以傳入一個(gè)原型對(duì)象,并創(chuàng)建一個(gè)基于該原型的新對(duì)象,但是新對(duì)象什么屬性都沒(méi)有,因此,我們可以編寫(xiě)一個(gè)函數(shù)來(lái)創(chuàng)建xiaoming:
// 原型對(duì)象: var Student = { name: 'Robot', height: 1.2, run: function () { console.log(this.name + ' is running...'); } }; function createStudent(name) { // 基于Student原型創(chuàng)建一個(gè)新對(duì)象: var s = Object.create(Student); // 初始化新對(duì)象: s.name = name; return s; } var xiaoming = createStudent('小明'); xiaoming.run(); // 小明 is running... xiaoming.__proto__ === Student; // true
相關(guān)文章
ie下$.getJSON出現(xiàn)問(wèn)題的解決方法
ie下$.getJSON出現(xiàn)問(wèn)題是常有的事,下面為大家介紹下具體該如何解決,需要的朋友可以參考下2014-02-02javaScript生成支持中文帶logo的二維碼(jquery.qrcode.js)
這篇文章主要介紹了javaScript生成二維碼,改造jquery.qrcode.js,使之支持中文,能帶logo的二維碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法,可實(shí)現(xiàn)數(shù)學(xué)上排列組合算法功能,涉及JavaScript數(shù)組與字符串操作技巧,需要的朋友可以參考下2016-01-01js閉包的6種應(yīng)用場(chǎng)景總結(jié)
如果一個(gè)函數(shù)訪問(wèn)了此函數(shù)的父級(jí)及父級(jí)以上的作用域變量,那么這個(gè)函數(shù)就是一個(gè)閉包,本文將給大家分享js閉包的6種應(yīng)用場(chǎng)景,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-09-09關(guān)于webpack2和模塊打包的新手指南(小結(jié))
本篇文章主要介紹了關(guān)于webpack2和模塊打包的新手指南(小結(jié)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08JavaScript語(yǔ)句可以不以;結(jié)尾的煩惱
JavaScript語(yǔ)句可以不以;結(jié)尾的煩惱...2007-03-03