為什麼很多明知js的OOP是假的,還不厭其煩地實現,而不使用OLOO風格?

時間 2021-05-14 16:17:56

1樓:靈劍

不懂你的意思,OOP首先是一種設計思維,其次是一種設計模式,最次才是語言對設計模式的原生支援。能實現將資料和演算法打包成物件、不同物件呼叫不同演算法(多型)就是OOP,C語言也有OOP,圖靈機都可以OOP……

2樓:林沈離

js的oop不是假的,js就是oop的。(雖然我曾經也誤會過這點)不管用什麼風格,在團隊內部容易理解交流即好。

錘子1和錘子2都能釘釘子,那肯定選團隊最順手的啊。

只要能保證開發好產品,擁有一定擴充套件性,可讀性,讓人能直觀理解,工程化完備。那就是正確的,而不是去深究爭吵裡面的道理。

都是被產品"壓迫"的苦逼程式猿,何苦自己人為難自己人。

能這麼說,是因為我是堅定的:"多學點其他的又不是壞事"黨派,都能信手拈來不是最好嗎??

3樓:

有規定 OOP 應該怎樣實現嗎?必須用 class 嗎?

相反,OOP 真正的意思是物件導向程式設計,而不是面向類程式設計。

所以誰是真的 OOP 還不一定呢

4樓:dreamhuan

js設計的太倉促了,現在在填坑。oop設計模式那一套可以拿來改一改直接用,oloo沒人了解,重新弄一套吃力不討好。畢竟現在js規模越來越大了不是做個特效的事了。

總結下大概就是oop抽象程度更高吧

補充一句,es6的oop一點都不繁瑣…ts的寫法和傳統oop已經差不多了。(雖然本質只是語法糖)

5樓:龍騰道默默地

別的不談。具體使用es6 class語法的過程中,發現一些優點和一些缺點:

優點1:會自動為物件呼叫原型鏈上的所有contructor函式(而且這些函式如果是正常呼叫還無法使用),並預設傳遞相同引數。

優點2:會自動將字面量屬性(包括例項函式屬性和靜態函式屬性)設定為非列舉屬性。

(就以上兩點而言,雖然只是語法糖,但在日常需求的情況下,方便又清晰得不是一點點。)

優點3:new.target 語法帶來的精確控制,實現抽象類。

缺點1:不支援外部屬性植入,像物件字面量那樣,導致大類只能很長地寫,無法拆分段落乃至檔案。

(這我認為是目前最大痛點,其次是還不支援私有屬性語法。)

缺點2:不支援非函式屬性,需要自己給contructor和prototype新增。(看趨勢就算支援了支援的也是每次執行時的屬性而非原型屬性)

缺點3:extends null 簡直是不知道怎麼想的設計,不是自動讓原型鏈以空物件開始,而是根本不建立而是要你自己生產物件,而生產的物件並不會也不可能做到被自動附加上後面的原型繼承——這種需求且不說有沒有,直接用函式就好了,浪費這個語法糖幹什麼?害得我只能:

function Null()

Null.prototype = object.create( null );

class MyClass extends Null

麻煩,還平白地多了一層原型鏈。

6樓:「已登出」

就像js的prototype實現很好用一樣。

為什麼__proto__非得是constructor的prototype?

為什麼construct乙個物件非要先設定constructor的prototype然後new constructor()?

就不能把prototype去掉,然後把__proto__改名叫prototype麼?

為什麼私有成員只能用閉包實現,而且「public」成員還不能訪問,只能再用閉包搞乙個「privileged」機制?

以及,x.y()裡面的this在什麼情況下不是x?

原型鏈機制本身很有趣沒錯,但是js這實現就很尷尬了。

然後另乙個問題是,作為乙個動態語言,js「自帶多型」,「根本不需要任何oop機制來實現」。

js多型最大的弱點是封裝,一方面,js既沒有型別系統,又沒有trait,這樣等於說你除了知道這個東西是個object,沒有任何其他機制來「確保」一些事情。

但是強求乙個無編譯期的動態語言去做好介面或者trait,以及做好型別系統,是不對的。

另一方面,js實現private「只能」依賴閉包。但是,只有閉包作用域之內的東西才能訪問閉包,這樣constructor就成了乙個非常尷尬的存在,另外,"public"成員只能通過"privileged"成員來訪問閉包,但同時,所有人都可以通過privileged成員來訪問閉包。

那等於還是沒有private對吧。

不過實際上這沒什麼關係,C沒有private,照樣能搞oo。

但是,雖然庫的使用者「可以」不去關心那些不需要去關心的東西,但庫的作者就「只能」祈禱使用者不會亂來。因為他幾乎沒有任何辦法去阻止。

那麼我們再說prototype的問題。在js中prototype最重要的只有成員共享,而且prototype實際上「並沒有」提供多型和封裝的能力。但是實際上這個成員共享除了實現重用以外,那些「危險」的東西才是prototype最神奇的力量。

但是話又說回來,js的多型能力即使在動態語言中也是獨樹一幟的,甚至在封裝性缺失的情況下依然很強大。

所以說,js的oop完全不是假的,只靠多型能力就已經很強了,只要再加上封裝能力就完整了,根本不需要prototype。

為什麼我們明知道鬼怪是假的,那麼,我們為什麼會害怕?

個人觀點 可能是因為我們沒有證實過鬼怪是否真實存在。我們未知的東西很多,所以我們會覺得鬼怪有可能存在,但只是沒有發現而已。 首先對於鬼怪的問題,在我看來並不是說不存在的或者說它是以一種特別的形式在我們的意識之外存在的,我們意識的鬼怪只是我們將他們通過我們的意識進行的二次加工,鬼怪從另一方面屬於自然力...

玩恐怖密室逃脫為什麼明知是假的還是會會害怕?

沈不知道 我玩那種帶真人npc的恐怖密室會非常的害怕,當然我並不是怕那些假扮鬼的npc,一身裝束沒什麼好怕的,我是怕那麼陰間的環境下真有鬼.所以在密室裡我就會自己腦補嚇自己 萬一結束後被告知npc就兩個,但是覆盤時發現玩的時候出現了第三個人 萬一玩的時候突然發現牆角站著個 npc 隊伍裡膽大的剛準備...

為什麼很多人會做明知道是錯誤的事?

王超拯救世界 人在潛意識裡對現在的行為對遠期帶來的收益進行折現,越是遠期折現比率越低,舉個例子,你可以選擇現在領10塊錢或者明天領11塊錢,肯定選擇現在領10塊錢。誰知道明天會是怎樣的狀況。人對馬上能得到回報看的比較重。比如說嗑瓜子停不下來 無論人們喜歡與否,很容易拿起第一顆瓜子,一旦吃上第一顆,就...