Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
對 HTML 進行分類(設(shè)置類),使我們能夠為元素的類定義 CSS 樣式。
為相同的類設(shè)置相同的樣式,或者為不同的類設(shè)置不同的樣式。
下面是一個例子
<html> <head> <style> .a { background-color:black; color:white; margin:20px; padding:20px; } </style> </head> <body> <div class="a"> <h2>標題</h2> <p>內(nèi)容第一段,天華信息教育,歡迎關(guān)注我,我會和大家分享你想知道的.</p> <p>內(nèi)容第二段,天華信息教育,歡迎關(guān)注我,我會和大家分享你想知道的.</p> </div> </body> </html>
HTML基礎(chǔ)教程: 類了解一下
一級標題至六級標題
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>不同等級的標題標簽對比</title>
</head>
<body>
<h1>頭條號</h1>
<h2>頭條號</h2>
<h3>頭條號</h3>
<h4>頭條號</h4>
<h5>頭條號</h5>
<h6>頭條號</h6>
</body>
</html>
近期似乎總是能在各種場合聽到"程序員中年危機"這種言論,說是程序員到了35歲就會很難跳槽,很容易被優(yōu)化等等。其實在今年疫情影響下各行各業(yè)經(jīng)濟都不景氣,公司手里沒錢肯定要節(jié)省成本,35歲的人一般對工資的要求比較高,所以對這種比較高級的程序員需求就會降低。當然除此之外肯定也有其他大家都在說的原因,例如精力不如畢業(yè)生,沒有年輕人能加班能干活,不能走入管理崗的中年人就會被淘汰等等。
其實個人感覺,雖然國內(nèi)環(huán)境比較浮躁,但是渴望高級技術(shù)人才的公司還是大有人在,打開招聘軟件還是能找到不少高級前端的招聘信息。到了中年靠的應該是自己的經(jīng)驗和技術(shù),去做一些更加高級的事情。既然做了開發(fā)這一行,我想大家大部分都是想專心做一些技術(shù)工作,少一些應酬和虛與委蛇,但是不可否認的是,隨著vue、react等等這種非常強大的框架普及,大部分程序員做的都是一些"最沒技術(shù)含量的技術(shù)",簡單地復制粘貼,查找官方文檔照著寫,很少再去關(guān)心技術(shù)細節(jié),時間久了自然會被淘汰。
啰嗦了這么多,其實也是說給自己聽的,要做高級的事情就要離開自己的舒適區(qū),去鉆研一些高級的事情。
今天就一起討論一下JavaScript的"類"和繼承。
如果你想用JavaScript做一些高級的事情,例如打造組件庫,封裝插件,一定離不開"類"和繼承,這是"封裝"里無法繞過的一環(huán)。
為什么要給"類"加上引號呢?
因為JavaScript的世界里根本沒有類,所有你見到的類,包括ES6里的新語法class,都不是真正的類,JavaScript是徹頭徹尾的,純粹到極致的面向?qū)ο笳Z言,一切皆對象。
我勸你最好暫時忘了之前接觸過的所有面向?qū)ο笳Z言。因為他們可能早已深深地誤導了你。
JavaScript的"類"和繼承實際上是利用原型鏈來實現(xiàn)的。例如下面的代碼:
這是js一個最常用的利用構(gòu)造函數(shù)聲明類的形式,里面有我們熟悉的new關(guān)鍵詞,表面上看確實是先有了Foo類然后用new實例化了一個對象。
但實際上Foo只是一個函數(shù),它和其它函數(shù)沒有什么不同,函數(shù)也是對象,直接像普通函數(shù)一樣直接調(diào)用Foo也不會出錯,加上new之后只是多了幾個操作:
這里我們看到a1并沒有say()方法,但是a1.say()卻正常運行了,這是原型鏈的作用,a1沒有say屬性,就去原型上查找,最終在Foo.prototype里找到。
關(guān)于什么是原型鏈這里就不細說了,這屬于js基礎(chǔ),不在高級討論范圍內(nèi)。
上面代碼本質(zhì)上我們是利用一個函數(shù)對象(Foo)又創(chuàng)建了另一個對象(a1),根本沒有傳統(tǒng)意義上的類!
嗯?等一下!利用對象生成對象?這不應該是Object.create()該干的事兒嗎?沒錯,上面的代碼完全可以利用Object.create()重構(gòu)!
這種寫法更符合JavaScript一切皆對象的說法!而且更加清楚易懂,原型鏈從上到下清晰可見。
JavaScript的new真是個千古大忽悠!還有更忽悠的,ES6里的class,讓js的本質(zhì)更加撲朔迷離:
多么美麗的代碼,多么讓人沉浸無法自拔,當當當!給我清醒點!千萬別讓它美麗的外表迷惑!照妖鏡拿來!給我看清楚了,它的本質(zhì)跟第一段代碼完全一樣!語法糖而已,實際上這里并沒有真正的類,class 仍然是通過 [[Prototype]]機制實現(xiàn)的。
我們再來看看繼承。
因為JavaScript沒有真正的類,所以所謂的繼承也都是一些掩人耳目的做法,通過各種惡心的手段達到復用和重寫的目的,來看看有多惡心:
代碼里SubFoo繼承了Foo,并且SubFoo重寫了Foo的say方法,里面充滿了大量的xxx.prototype,為了讓SubFoo和Foo扯上關(guān)系,必須讓它們的原型鏈接起來:SubFoo.prototype=Object.create(Foo.prototype)。還有許多難以理解的借調(diào)(xxx.call()),特別是為了達到繼承Foo的say方法而寫的這一句:Foo.prototype.say.call(this),多么的丑陋。對于當初涉世未深的你能理解這幾句代碼里面的含義嗎?為了理解這些你花了多久?
為了我腦袋上所剩無幾的頭發(fā),呸!
當然有了ES6后情況有所好轉(zhuǎn):
還是那句話,語法糖而已,本質(zhì)上還是要讓Foo和SubFoo兩個小東西互相扯來扯去,如果再深入一點——加上二級、三級繼承——情況會無法想象地復雜。
說到底這些其實都是強行使用類的思想來理解JavaScript的一切皆對象而出現(xiàn)的"變態(tài)"代碼。如果你放下屠刀,換一個思路,使用JavaScript語言最初的設(shè)計思路就會發(fā)現(xiàn),一切其實非常簡單,我們用一切皆對象的思路再來實現(xiàn)一遍上面的邏輯:
怎么樣?沒有了亂七八糟的prototype和構(gòu)造函數(shù),不用擔心原型鏈的走向,一切清新自然,而且最重要的,一切都是對象。
這種實現(xiàn)方式的官方叫法(非人話叫法)就是"行為委托"。在行為委托模式中,F(xiàn)oo和 SubFoo只是對象,它們之間是兄弟關(guān)系,并不是父類和子類的關(guān)系。代碼中 Foo委托了 SubFoo,反向委托也完全沒問題,我們也不需要實例化類,因為它們根本就不是類,它們只是對象。此外,我們擺脫了一大堆的prototype和借調(diào),我們使用了一種極其簡單的方式完成了封裝。
當然往深處里講,上述幾種方式每個方式都有自己的優(yōu)缺點。不能很武斷地說這個好那個不好,在不同場景里選擇最合適的實現(xiàn)方式是作為一名高級技術(shù)人員時刻該考慮的事情。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。