摘要:提供以及特定的包管理機(jī)制。語(yǔ)言宏,你得了解預(yù)處理器全局變量,連接器和的區(qū)別,多繼承等。滿足滿足不滿足所以說(shuō)基本滿足條吧滿足條件的繼承將上的屬性放置到上將上的屬性放置到上更好的寫法我參考的實(shí)現(xiàn)依賴是不是更方便呢
javascript是一門比較難精通的語(yǔ)言,原因是其他語(yǔ)言提供機(jī)制,javascript提供方法。
在我看來(lái),語(yǔ)言如java,python比較好學(xué)的語(yǔ)言有一個(gè)特點(diǎn):關(guān)鍵字多。java提供extends,implements,以及特定的包管理機(jī)制。python特殊的文本結(jié)構(gòu),大量API等。這些語(yǔ)言可以使初學(xué)者快速上手,因?yàn)榇蠖鄶?shù)需求的滿足都是靠機(jī)制。語(yǔ)言提供的關(guān)鍵字,庫(kù)管理,API。一句話就是大家寫的代碼都一樣,思路一樣,代碼就一樣(或差別不大,因?yàn)樵O(shè)計(jì)模式的存在,有結(jié)構(gòu)差異,但底層結(jié)構(gòu)也相同)。
另一種語(yǔ)言提供作用域,內(nèi)存布局,語(yǔ)言本身的默認(rèn)設(shè)置等。這種語(yǔ)言如c,c++,javascript,函數(shù)式語(yǔ)言。本身是帶有一種編譯器或解釋器的感覺(jué)。就是用戶身在其中,需要知道一些編譯器開發(fā)人員才需要的知識(shí)。就以javascript來(lái)說(shuō)吧,要想實(shí)現(xiàn)繼承,你就得了解解釋器在讀取一個(gè)對(duì)象的屬性的過(guò)程中是怎么尋找的(原型鏈)。c語(yǔ)言:宏,你得了解預(yù)處理器;全局變量,連接器;C++:struct和class的區(qū)別,vptr,多繼承等。
說(shuō)這么多,只是想為自己花了半年學(xué)javascript的痛苦吐槽一下,并沒(méi)有比較語(yǔ)言的意思,莫噴!java那種思路一下,代碼差別不大的優(yōu)勢(shì)在企業(yè)級(jí)開發(fā)中才能體現(xiàn),so i love java!絕沒(méi)有瞧不起的意思。
以java為例:
class Parent{
String name; //private field Parent(String name){ this.name = name; }
}
class Child{
int id; //private field Child(String name,int id){ super(name); this.id = id; }
}
繼承的重點(diǎn):
1.Child實(shí)例化之前,Parent必須實(shí)例化
2.Child對(duì)象可以使用Parent對(duì)象的方法和屬性
3.Child可以添加自己的方法,如果方法名相同,則覆蓋Parent的方法
4.Child可以添加自己的靜態(tài)方法,可以繼承Parent的父類方法
這也是網(wǎng)上比較多的繼承方法(類式繼承):
function Parent () { this.ParentValue = true; //private field } Parent.staticP = 1; Parent.prototype.getValue = function () { return this.ParentValue; } function Child () { this.ChildValue = true; //private field } Child.prototype = new Parent(); Child.prototype.getValue = function () { return this.ChildValue; } Child.staticC = 1;
這種方式不能滿足上面的4個(gè)條件:
1.滿足,但是不是完全相同。Parent在Child定義時(shí)就已經(jīng)實(shí)例化了,Parent實(shí)例化太超前了,導(dǎo)致所有Child對(duì)象同享一個(gè)Parent實(shí)例,如果一個(gè)Child對(duì)象改變了Parentvalue,所有Child對(duì)象都發(fā)生改變。
2.滿足
3.滿足
4.不滿足
所以說(shuō)基本滿足2.5條吧
function Parent () { this.ParentValue = true; //private field } Parent.staticP = 1; Parent.prototype.getValue = function () { return this.ParentValue; } function Child (p,c) { Parent.call(this,p); this.ChildValue = c; //private field } Child.staticC = 1; inheritPrototype(Parent,Child); Child.prototype.getValue = function () { return this.ChildValue; } function inheritPrototype (Parent,Child) { merge(Parent,Child); //將Parent上的屬性放置到Parent上 var p = inheritObject(Parent.prototype); p.constructor = Child; return p; } function inheritObject (o) { function F(){} F.prototype = o; return new F(); } //將Parent上的屬性放置到Parent上 function merge (dist,source) { for(attr in source){ if(source.hasOwnProperty(attr)){ if(!dist.hasOwnProperty(attr)){ dist[attr] = source[attr]; } } } }更好的寫法
我參考Backbone的實(shí)現(xiàn)
Backbone依賴Underscore
function Parent () { this.ParentValue = true; //private field } Parent.staticP = 1; function Child (p,c) { Parent.call(this,p); this.ChildValue = c; //private field } function extend(Parent,Child,protoProps,staticProps){ _.extend(Child, Parent, staticProps); Child.prototype = _.create(Parent.prototype, protoProps); Child.prototype.constructor = Child; return Child; } extend(Parent,Child,{ getValue: function() { return this.ParentValue; } }, { staticC: 1 }); 是不是更方便呢!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78846.html
摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱為構(gòu)造函數(shù)繼承,在中是一種關(guān)鍵的實(shí)現(xiàn)的繼承方法,相信你已經(jīng)很好的掌握了。 你應(yīng)該知道,JavaScript是一門基于原型鏈的語(yǔ)言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關(guān)。甚至可以說(shuō),所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構(gòu)造函數(shù),原型屬性與實(shí)例對(duì)象 要搞清楚如何在JavaScript中實(shí)現(xiàn)繼承,...
摘要:中的繼承并不是明確規(guī)定的,而是通過(guò)模仿實(shí)現(xiàn)的。繼承中的繼承又稱模擬類繼承。將函數(shù)抽離到全局對(duì)象中,函數(shù)內(nèi)部直接通過(guò)作用域鏈查找函數(shù)。這種范式編程是基于作用域鏈,與前面講的繼承是基于原型鏈的本質(zhì)區(qū)別是屬性查找方式的不同。 這一節(jié)梳理對(duì)象的繼承。 我們主要使用繼承來(lái)實(shí)現(xiàn)代碼的抽象和代碼的復(fù)用,在應(yīng)用層實(shí)現(xiàn)功能的封裝。 javascript 的對(duì)象繼承方式真的是百花齊放,屬性繼承、原型繼承、...
摘要:繼承前言作為一門輕量級(jí)的腳本語(yǔ)言在和的橫空出世之后將其推向的新的高度雖然中出現(xiàn)的新的生成對(duì)象的類語(yǔ)法格式但依然為的語(yǔ)法糖而我們依然有必要從的原生實(shí)現(xiàn)入手來(lái)了解它的繼承實(shí)現(xiàn)方式給出了更加簡(jiǎn)潔的固定的類聲明方式有興趣的可以查看阮一峰的入門下面給 javascript繼承 前言 javascript作為一門輕量級(jí)的腳本語(yǔ)言在ES6和node.js的橫空出世之后將其推向的新的高度,雖然 ES6...
摘要:我們有了構(gòu)造函數(shù)之后,第二步開始使用它構(gòu)造一個(gè)函數(shù)。來(lái)個(gè)例子這種方式很簡(jiǎn)單也很直接,你在構(gòu)造函數(shù)的原型上定義方法,那么用該構(gòu)造函數(shù)實(shí)例化出來(lái)的對(duì)象都可以通過(guò)原型繼承鏈訪問(wèn)到定義在構(gòu)造函數(shù)原型上的方法。 來(lái)源: 個(gè)人博客 白話解釋 Javascript 原型繼承(prototype inheritance) 什么是繼承? 學(xué)過(guò)面向?qū)ο蟮耐瑢W(xué)們是否還記得,老師整天掛在嘴邊的面向?qū)ο笕筇?..
摘要:和構(gòu)造函數(shù)前面提到,是個(gè)內(nèi)置隱藏屬性,雖然在可以通過(guò)訪問(wèn),但是其設(shè)計(jì)本意是不可被讀取和修改的,那么我們?nèi)绾卫迷玩渷?lái)建立繼承關(guān)系提供了關(guān)鍵字。到這兒,思路就清晰了,怎么讓對(duì)象和對(duì)象的相連實(shí)現(xiàn)繼承只需把的構(gòu)造函數(shù)的連接到就行了。 什么是繼承? 大多數(shù)人使用繼承不外乎是為了獲得這兩點(diǎn)好處,代碼的抽象和代碼的復(fù)用。代碼的抽象就不用說(shuō)了,交通工具和汽車這類的例子數(shù)不勝數(shù),在傳統(tǒng)的OO語(yǔ)言中(...
閱讀 1191·2023-04-25 14:35
閱讀 2867·2021-11-16 11:45
閱讀 3474·2021-09-04 16:48
閱讀 2211·2021-08-10 09:43
閱讀 557·2019-08-30 13:17
閱讀 1658·2019-08-29 13:27
閱讀 930·2019-08-26 13:58
閱讀 2185·2019-08-26 13:48