javascript 面向?qū)ο髮崙?zhàn)思想分享
一直以來,很多新手都會經(jīng)常問,我學(xué)完了基礎(chǔ)知識,如何做項目?平時在公司工作都是做些什么?其實我想說,只要你找對方法,隨便打開一個網(wǎng)站,都能是你的項目。
這里指的面向?qū)ο蟛粏螁芜m用于javascript,也適用其他語言。
萬物皆對象,所以,任何事物都是有特征(屬性)和動作(方法)的,一般拿到一份需求分檔,或者你瀏覽一個網(wǎng)頁看到一個畫面的時候,腦子里就要有提煉出來的屬性和方法的能力,那你才是合格的。
例如一個購物車例子

估計很多人都做過購物車,我就不賣關(guān)子,做任何東西,先宏觀思考*,然后再去處理細節(jié),然后組裝起來,就好像組裝汽車的道理一樣。例如上圖,紅色的就是屬性,黃色的就是方法,抽象出屬性和方法,其他都是死的。
假如是剛學(xué)前端的同學(xué),可能就會用這種全局化的變量,也叫面向函數(shù)編程,缺點就是很亂,代碼冗余
//商品屬性
var name = 'macbook pro'
var description = ''。'
var price = 0;
//商品方法
addOne:funcion(){alert('增加一件商品')},
reduceOne:function(){alert('減少一件商品')},
//購物車屬性
var card = ['macbook pro' ,'dell']
var sum = 2,
var allPrice = 22000,
//購物車方法
function addToCart:function(){
alert('添加到購物車')
}
addToCart()
假如是單例模式的思想,可能會這樣做,但這樣還是不太好。對象太多,可能造成變量重復(fù),項目小還可以接受
var product={
name:'macbook pro',
description:'',
price:6660,
addOne:funcion(){},
reduceOne:function(){},
addToCart:function(){
alert('添加到購物車')
}
}
/*購物車*/
var cart={
name:'購物車',
products:[],
allPrice:5000,
sum:0
}
假如是有一定經(jīng)驗的人,可能會這樣子做。
function Product(name,price,des) {
/*屬性 行為 可以為空或者給默認值*/
this.name = name;
this.price = price;
this.description = des;
}
Product.prototype={
addToCart:function(){
alert('添加到購物車')
}
addOne:funcion(){},
reduceOne:function(){},
/*綁定元素*/
bindDom:function(){
//在這里進行字符串拼接,
//例如
var str = ''
str +='<div>價格是:'+this.privce+'</div>'
return str
},
}
function Card(products,allPrice,sum) {
/*屬性 行為 可以為空或者給默認值*/
this.products = products;
this.allPrice = allPrice;
this.sum = sum
}
Product.prototype={
getAllPrice:function(){
alert('計算購物車內(nèi)商品總價')
}
}
通過創(chuàng)建各種對象例如macbook
//后臺給的數(shù)據(jù)
var products= [
{name:'macbook',price:21888},
{name:'dell',price:63999}
]
var str = ''
for(var i = 0,len=products.length;i<len;i++) {
var curName = products[i].name
var curName = new Product()
curName.name=products[i].name;
curName.price=products[i].price;
str+= curName.bindDom()
}
上面這種方式,就降低了耦合性,不管你用什么語言,還是任何javascript框架(模板引擎,jquery,react等),都是脫離不開上面那段代碼的思想,
再來說說,現(xiàn)在mvvm的模式,例如vue,他們不需要獲取dom,那么渲染的時候,定義好一個一個的組件就行了。屬性全部用{{}}定義好,剩下的就是替換模板,就解決了。
data:{
name ='',
price='',
description = ''
},
methods:{
addToCart:function(){
alert('添加到購物車')
}
addOne:funcion(){},
reduceOne:function(){},
}
然后page級組件引入這個產(chǎn)品組件,然后循環(huán)這個產(chǎn)品組件就好了。
組件化的好處
將代碼分類管理
代碼清晰
容易維護
容易發(fā)現(xiàn)問題
代碼可讀性好
易于團隊化協(xié)作
當(dāng)然這篇文章是為了鍛煉抽象化思維的能力,雖然跟javascript模塊化的歷程也有點搭邊,我還希望大家在瀏覽任何網(wǎng)頁的時候,去分析一下,這個模塊你來設(shè)計,你會怎么設(shè)計,能做到解耦和,版本可迭代可維護,利于團隊開發(fā)嗎?
如有不對,請指正
相關(guān)文章
JavaScript中遍歷對象的property的3種方法介紹
這篇文章主要介紹了JavaScript中遍歷對象的property的3種方法介紹,本文先是講解了3種方法并用一張圖片加深理解,然后給出代碼實例,需要的朋友可以參考下2014-12-12
javascript(js)的小數(shù)點乘法除法問題詳解
本篇文章主要是對javascript(js)中的小數(shù)點乘法除法問題進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03
javascript實現(xiàn)滾動效果的數(shù)字時鐘實例
這篇文章主要是介紹使用javascript來實現(xiàn)數(shù)字時鐘滾動的效果,非常實用,有需要的朋友們可以來參考學(xué)習(xí)。2016-07-07
關(guān)于JavaScript中高階函數(shù)的魅力詳解
高階函數(shù):英文叫Higher-order function。JavaScript的函數(shù)其實都指向某個變量。下面這篇文章主要給大家介紹了關(guān)于JavaScript中高階函數(shù)的魅力,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2018-09-09

