JavaScript不使用prototype和new實(shí)現(xiàn)繼承機(jī)制
此方法并非筆者原創(chuàng),筆者只是在前輩的基礎(chǔ)上,加以總結(jié),得出一種簡(jiǎn)潔實(shí)用的JavaScript繼承方法。
傳統(tǒng)的JavaScript繼承基于prototype原型鏈,并且需要使用大量的new操作,代碼不夠簡(jiǎn)潔,可讀性也不是很強(qiáng),貌似還容易受到原型鏈污染。
筆者總結(jié)的繼承方式,簡(jiǎn)潔明了,雖然不是最好的方式,但希望能給讀者帶來(lái)啟發(fā)。
好了,廢話不多說(shuō),直接看代碼,注釋詳盡,一看就懂~~~
/**
* Created by 楊元 on 14-11-11.
* 不使用prototype實(shí)現(xiàn)繼承
*
*/
/**
* Javascript對(duì)象復(fù)制,僅復(fù)制一層,且僅復(fù)制function屬性,不通用!
* @param obj 要復(fù)制的對(duì)象
* @returns Object
*/
Object.prototype.clone = function(){
var _s = this,
newObj = {};
_s.each(function(key, value){
if(Object.prototype.toString.call(value) === "[object Function]"){
newObj[key] = value;
}
});
return newObj;
};
/**
* 遍歷obj所有自身屬性
*
* @param callback 回調(diào)函數(shù)。回調(diào)時(shí)會(huì)包含兩個(gè)參數(shù): key 屬性名,value 屬性值
*/
Object.prototype.each = function(callback){
var key = "",
_this = this;
for (key in _this){
if(Object.prototype.hasOwnProperty.call(_this, key)){
callback(key, _this[key]);
}
}
};
/**
* 創(chuàng)建子類
* @param ext obj,包含需要重寫或擴(kuò)展的方法。
* @returns Object
*/
Object.prototype.extend = function(ext){
var child = this.clone();
ext.each(function(key, value){
child[key] = value;
});
return child;
};
/**
* 創(chuàng)建對(duì)象(實(shí)例)
* @param arguments 可接受任意數(shù)量參數(shù),作為構(gòu)造器參數(shù)列表
* @returns Object
*/
Object.prototype.create = function(){
var obj = this.clone();
if(obj.construct){
obj.construct.apply(obj, arguments);
}
return obj;
};
/**
* Useage Example
* 使用此種方式繼承,避免了繁瑣的prototype和new。
* 但是目前筆者寫的這段示例,只能繼承父類的function(可以理解為成員方法)。
* 如果想繼承更豐富的內(nèi)容,請(qǐng)完善clone方法。
*
*
*/
/**
* 動(dòng)物(父類)
* @type {{construct: construct, eat: eat}}
*/
var Animal = {
construct: function(name){
this.name = name;
},
eat: function(){
console.log("My name is "+this.name+". I can eat!");
}
};
/**
* 鳥(子類)
* 鳥類重寫了父類eat方法,并擴(kuò)展出fly方法
* @type {子類|void}
*/
var Bird = Animal.extend({
eat: function(food){
console.log("My name is "+this.name+". I can eat "+food+"!");
},
fly: function(){
console.log("I can fly!");
}
});
/**
* 創(chuàng)建鳥類實(shí)例
* @type {Jim}
*/
var birdJim = Bird.create("Jim"),
birdTom = Bird.create("Tom");
birdJim.eat("worm"); //My name is Jim. I can eat worm!
birdJim.fly(); //I can fly!
birdTom.eat("rice"); //My name is Tom. I can eat rice!
birdTom.fly(); //I can fly!
- Javascript中 關(guān)于prototype屬性實(shí)現(xiàn)繼承的原理圖
- JavaScript類和繼承 prototype屬性
- js中繼承的幾種用法總結(jié)(apply,call,prototype)
- 深入了解javascript中的prototype與繼承
- javascript prototype的深度探索不是原型繼承那么簡(jiǎn)單
- JavaScript面向?qū)ο笾甈rototypes和繼承
- Javascript 原型和繼承(Prototypes and Inheritance)
- JavaScript使用prototype原型實(shí)現(xiàn)的封裝繼承多態(tài)示例
- javascript基于prototype實(shí)現(xiàn)類似OOP繼承的方法
- Javascript中的prototype與繼承
- JS偽繼承prototype實(shí)現(xiàn)方法示例
- JavaScript使用prototype屬性實(shí)現(xiàn)繼承操作示例
相關(guān)文章
移動(dòng)端如何用下拉刷新的方式實(shí)現(xiàn)上拉加載
這篇文章主要介紹了移動(dòng)端如何用下拉刷新的方式實(shí)現(xiàn)上拉加載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
JavaScript?進(jìn)階問(wèn)題列表(各種js代碼段108-155)
從基礎(chǔ)到進(jìn)階,測(cè)試你有多了解?JavaScript,刷新你的知識(shí),或者幫助你的?coding?面試!?:muscle:?:rocket:?我每周都會(huì)在這個(gè)倉(cāng)庫(kù)下更新新的問(wèn)題2024-11-11
《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記三:Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)單例模式原理與實(shí)現(xiàn)方法分析
這篇文章主要介紹了Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)單例模式原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了《javascript設(shè)計(jì)模式》中Javascript面向?qū)ο髥卫J较嚓P(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
JavaScript模仿Pinterest實(shí)現(xiàn)圖片預(yù)加載功能
圖片預(yù)加載是web開發(fā)中一種應(yīng)用相當(dāng)廣泛的技術(shù),比如我們?cè)谧鰣D片翻轉(zhuǎn)顯示等特效的時(shí)候,為了讓圖片在轉(zhuǎn)換的時(shí)候不出現(xiàn)等待,我們最好是先讓圖片下載到本地,然后在繼續(xù)執(zhí)行后續(xù)的操作。今天本文主要介紹的是利用JS模仿Pinterest圖片社交網(wǎng)站的圖片預(yù)加載功能。2016-10-10
JavaScript判斷變量是否為undefined的兩種寫法區(qū)別
這篇文章主要是對(duì)JavaScript判斷變量是否為undefined的兩種寫法區(qū)別進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
JavaScript類型系統(tǒng)之布爾Boolean類型詳解
這篇文章主要介紹了JavaScript類型系統(tǒng)之布爾Boolean類型詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
JavaScript對(duì)Cookie進(jìn)行讀寫操作實(shí)例
這篇文章主要介紹了JavaScript對(duì)Cookie進(jìn)行讀寫操作的方法,實(shí)例分析了javascript針對(duì)cookie的讀寫操作技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-07-07
利用NodeJS和PhantomJS抓取網(wǎng)站頁(yè)面信息以及網(wǎng)站截圖
這篇文章主要介紹了利用NodeJS和PhantomJS抓取網(wǎng)站頁(yè)面信息以及網(wǎng)站截圖的方法,提供實(shí)例代碼供大家參考2013-11-11

