摘要:提供以及特定的包管理機制。語言宏,你得了解預處理器全局變量,連接器和的區別,多繼承等。滿足滿足不滿足所以說基本滿足條吧滿足條件的繼承將上的屬性放置到上將上的屬性放置到上更好的寫法我參考的實現依賴是不是更方便呢
javascript是一門比較難精通的語言,原因是其他語言提供機制,javascript提供方法。
在我看來,語言如java,python比較好學的語言有一個特點:關鍵字多。java提供extends,implements,以及特定的包管理機制。python特殊的文本結構,大量API等。這些語言可以使初學者快速上手,因為大多數需求的滿足都是靠機制。語言提供的關鍵字,庫管理,API。一句話就是大家寫的代碼都一樣,思路一樣,代碼就一樣(或差別不大,因為設計模式的存在,有結構差異,但底層結構也相同)。
另一種語言提供作用域,內存布局,語言本身的默認設置等。這種語言如c,c++,javascript,函數式語言。本身是帶有一種編譯器或解釋器的感覺。就是用戶身在其中,需要知道一些編譯器開發人員才需要的知識。就以javascript來說吧,要想實現繼承,你就得了解解釋器在讀取一個對象的屬性的過程中是怎么尋找的(原型鏈)。c語言:宏,你得了解預處理器;全局變量,連接器;C++:struct和class的區別,vptr,多繼承等。
說這么多,只是想為自己花了半年學javascript的痛苦吐槽一下,并沒有比較語言的意思,莫噴!java那種思路一下,代碼差別不大的優勢在企業級開發中才能體現,so i love java!絕沒有瞧不起的意思。
以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; }
}
繼承的重點:
1.Child實例化之前,Parent必須實例化
2.Child對象可以使用Parent對象的方法和屬性
3.Child可以添加自己的方法,如果方法名相同,則覆蓋Parent的方法
4.Child可以添加自己的靜態方法,可以繼承Parent的父類方法
這也是網上比較多的繼承方法(類式繼承):
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個條件:
1.滿足,但是不是完全相同。Parent在Child定義時就已經實例化了,Parent實例化太超前了,導致所有Child對象同享一個Parent實例,如果一個Child對象改變了Parentvalue,所有Child對象都發生改變。
2.滿足
3.滿足
4.不滿足
所以說基本滿足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的實現
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 }); 是不是更方便呢!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78846.html
摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱為構造函數繼承,在中是一種關鍵的實現的繼承方法,相信你已經很好的掌握了。 你應該知道,JavaScript是一門基于原型鏈的語言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關。甚至可以說,所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構造函數,原型屬性與實例對象 要搞清楚如何在JavaScript中實現繼承,...
摘要:中的繼承并不是明確規定的,而是通過模仿實現的。繼承中的繼承又稱模擬類繼承。將函數抽離到全局對象中,函數內部直接通過作用域鏈查找函數。這種范式編程是基于作用域鏈,與前面講的繼承是基于原型鏈的本質區別是屬性查找方式的不同。 這一節梳理對象的繼承。 我們主要使用繼承來實現代碼的抽象和代碼的復用,在應用層實現功能的封裝。 javascript 的對象繼承方式真的是百花齊放,屬性繼承、原型繼承、...
摘要:繼承前言作為一門輕量級的腳本語言在和的橫空出世之后將其推向的新的高度雖然中出現的新的生成對象的類語法格式但依然為的語法糖而我們依然有必要從的原生實現入手來了解它的繼承實現方式給出了更加簡潔的固定的類聲明方式有興趣的可以查看阮一峰的入門下面給 javascript繼承 前言 javascript作為一門輕量級的腳本語言在ES6和node.js的橫空出世之后將其推向的新的高度,雖然 ES6...
摘要:我們有了構造函數之后,第二步開始使用它構造一個函數。來個例子這種方式很簡單也很直接,你在構造函數的原型上定義方法,那么用該構造函數實例化出來的對象都可以通過原型繼承鏈訪問到定義在構造函數原型上的方法。 來源: 個人博客 白話解釋 Javascript 原型繼承(prototype inheritance) 什么是繼承? 學過面向對象的同學們是否還記得,老師整天掛在嘴邊的面向對象三大特...
摘要:和構造函數前面提到,是個內置隱藏屬性,雖然在可以通過訪問,但是其設計本意是不可被讀取和修改的,那么我們如何利用原型鏈來建立繼承關系提供了關鍵字。到這兒,思路就清晰了,怎么讓對象和對象的相連實現繼承只需把的構造函數的連接到就行了。 什么是繼承? 大多數人使用繼承不外乎是為了獲得這兩點好處,代碼的抽象和代碼的復用。代碼的抽象就不用說了,交通工具和汽車這類的例子數不勝數,在傳統的OO語言中(...
閱讀 1082·2023-04-25 14:35
閱讀 2837·2021-11-16 11:45
閱讀 3432·2021-09-04 16:48
閱讀 2191·2021-08-10 09:43
閱讀 539·2019-08-30 13:17
閱讀 1635·2019-08-29 13:27
閱讀 900·2019-08-26 13:58
閱讀 2163·2019-08-26 13:48