JavaScript設(shè)計(jì)模式之原型模式分析【ES5與ES6】
本文實(shí)例講述了JavaScript設(shè)計(jì)模式之原型模式。分享給大家供大家參考,具體如下:
從設(shè)計(jì)模式的角度講,原型模式是用于創(chuàng)建對(duì)象的一種模式,若需要?jiǎng)?chuàng)建一個(gè)對(duì)象,一種方法是先指定其類型,然后通過類來創(chuàng)建這個(gè)對(duì)象,另一種方法是通過原型來創(chuàng)建,不必關(guān)心對(duì)象的具體類型,而是找到一個(gè)對(duì)象,然后通過克隆來創(chuàng)建一個(gè)一模一樣的對(duì)象。
ES5提供了Object.create(obj)方法來克隆對(duì)象,在不支持Object.create(obj)方法的瀏覽器中,可以使用以下代碼:
Object.create = Object.create || function(obj) {
function Func() {};
Func.prototype = obj;
return new Func();
}
一、JavaScript中的原型繼承:
1. 大部分的數(shù)據(jù)都是對(duì)象;
JavaScript有兩種類型機(jī)制:基本類型和對(duì)象類型?;绢愋桶?code>undefined、number、boolean、string、function、object。
JavaScript設(shè)計(jì)者的本意在于,除了undefined,一切都應(yīng)該是對(duì)象,為了實(shí)現(xiàn)這一目標(biāo),number、boolean、string這幾種基本數(shù)據(jù)類型通過對(duì)應(yīng)的包裝類Number、Boolean、String來變成對(duì)象類型數(shù)據(jù)。
JavaScript中的根對(duì)象是Object.prototype對(duì)象,Object.prototype對(duì)象是一個(gè)空的對(duì)象。JavaScript的每個(gè)對(duì)象,實(shí)際上都是從Object.prototype對(duì)象克隆而來的,Object.prototype對(duì)象就是它們的原型。
ES5提供了getPrototypeOf來查看對(duì)象的原型,Object.getPrototypeOf(任何對(duì)象) == Object.prototype都會(huì)返回true。
2. 要得到一個(gè)對(duì)象,不是通過實(shí)例化類,而是找到一個(gè)對(duì)象作為原型并克隆它;
JavaScript沒有類的概念,new運(yùn)算符后面的不是類,而是構(gòu)造器。當(dāng)使用new運(yùn)算符來創(chuàng)建對(duì)象時(shí),實(shí)際上也是先克隆Object.prototype對(duì)象,再進(jìn)行一些額外操作的過程。
3. 對(duì)象會(huì)記住它的原型;
其實(shí)不能說對(duì)象有原型,而只能說對(duì)象的構(gòu)造器有原型。JavaScript給對(duì)象提供了一個(gè)名為__proto__屬性,默認(rèn)指向它的構(gòu)造器的原型,__proto__屬性是對(duì)象與構(gòu)造器的原型聯(lián)系起來的紐帶,如:person.__proto__ == Person.prototype。
4. 若對(duì)象無法響應(yīng)某個(gè)請(qǐng)求,它會(huì)把該請(qǐng)求委托給它自己的原型。
這是原型繼承的精髓,當(dāng)一個(gè)對(duì)象無法響應(yīng)某個(gè)請(qǐng)求時(shí),會(huì)順著原型鏈把請(qǐng)求傳遞下去,直到遇到一個(gè)可以處理該請(qǐng)求的對(duì)象為止。但是,原型鏈并不是無限長(zhǎng)的,只會(huì)查找到Object.prototype對(duì)象為止,由于Object.prototype的原型是null,因此請(qǐng)求無法找到可以處理的對(duì)象,返回undefined。
二、原型繼承的未來
使用Object.create來實(shí)現(xiàn)原型繼承似乎更能體現(xiàn)原型模式的精髓,但是,通過Object.create創(chuàng)建對(duì)象的效率并不高,通常要比通過構(gòu)造函數(shù)創(chuàng)建對(duì)象慢。
ES6帶來了新的Class語法,這讓JavaScript看起來像是一門基于類的語言,但背后仍然是通過原型機(jī)制來創(chuàng)建對(duì)象。
class Person {
constuctor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
class Student extends Person {
constuctor(name) {
super(name);
}
sayHello() {
alert(“Hello”);
}
}
var student = new Student(“Alice”);
student.sayHello();
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
如何通過JS實(shí)現(xiàn)轉(zhuǎn)碼與解碼
這篇文章主要介紹了如何通過JS實(shí)現(xiàn)轉(zhuǎn)碼與解碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
JS組件封裝之監(jiān)聽localStorage的變化
這篇文章主要介紹了JS組件封裝之監(jiān)聽localStorage的變化,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
js實(shí)現(xiàn)的類似于asp數(shù)據(jù)字典的數(shù)據(jù)類型代碼實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)的類似于asp數(shù)據(jù)字典的數(shù)據(jù)類型代碼實(shí)例,即js實(shí)現(xiàn)的字典數(shù)據(jù)類型,需要的朋友可以參考下2014-09-09
使用腳本控制網(wǎng)頁Table的顯示隱藏(全代碼)_AX
使用腳本控制網(wǎng)頁Table的顯示隱藏(全代碼)_AX...2006-12-12
javascript中createElement的兩種創(chuàng)建方式
這篇文章主要介紹了javascript中createElement的兩種創(chuàng)建方式,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
如何利用javascript接收json信息并進(jìn)行處理
這篇文章主要介紹了如何利用javascript接收json信息并進(jìn)行處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
JavaScript新引入的原始數(shù)據(jù)類型Symbol詳解
Symbol是ES6中引入的一種新的基本數(shù)據(jù)類型,用于表示一個(gè)獨(dú)一無二的值。它是JavaScript中的第七種數(shù)據(jù)類型。本文將詳細(xì)講講Symbol的使用,需要的可以參考一下2023-01-01
使用smartupload組件實(shí)現(xiàn)jsp+jdbc上傳下載文件實(shí)例解析
這篇文章主要介紹了使用smartupload組件實(shí)現(xiàn)jsp+jdbc上傳下載文件實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01

