function A(){
var privateAttr = 'a'
/*使用私有屬性的公有方法必須在構造函數中聲明。爲了減小內存的損耗,能夠在構造函數中聲明get/set方法或者在prototype中實現帶有須要使用的 私有屬性做爲參數的公共方法,而後再在構造方法中聲明對外的公共方法 */
this.sayHello = function(){
this._sayHello(privateAttr)
}
}
A.prototype._sayHello = function(privateAttr){
console.log(""+privateAttr)
}
複製代碼
靜態方法和屬性和其餘面嚮對象語言相似,爲類對象的屬性和方法。javascript
A.staticAttr = 10
A.staticFunction = function(){}
複製代碼
另外一種方式,減小方法對內存的佔用,我愈來愈傾向於使用這種寫法。css
(function () {
/*map用於存放該類全部對象的私有屬性。須要使用數組實現的兼容補丁。WeakMap也能夠是Map/Object。當心內存泄露!*/
var map = new WeakMap()
window.A = function () {
var data = {
a:10,
b:20
}
map.set(this,data)
}
A.prototype.getA = function () {
var data = map.get(this)
return data.a
}
A.prototype.setA = function (a) {
var data = map.get(this)
data.a = a
}
A.prototype.getB = function () {
var data = map.get(this)
return data.b
}
})()
複製代碼
Function.prototype.extend = function(superClass,publicObject,staticObject) {
if(typeof this === 'function'){
if(typeof superClass === 'function' ){
var Super = function(){}
Super.prototype = superClass.prototype
this.prototype = new Super()
this.prototype.constructor = this
}
//可能刪除如下代碼
if(typeof publicObject === 'object'){
this.prototype.shallowCopy(publicObject)
}
if(typeof staticObject === 'object'){
this.shallowCopy(staticObject)
}
}
}
function Super(){
}
function Sub(){
Super.call(this,....)
}
Sub.extend(Super)
複製代碼
function Super(){
this.sayHello = function(){}
}
function Sub(){
Super.call(this,....)
var superSayHello = this.sayHello //若是是原型方法則直接調用。
this.sayHello = function(){
superSayHello()
...
}
}
Sub.extend(Super)
複製代碼
export function BCSView(element, style) {
//如下注釋代碼是想讓js和swift的建立對象的語法一致。
//swift建立對象語法 var view = BCSView()
//js部分類如Object,Date支持這種建立對象的語法,部分類如Set,Map不支持(Chrome下驗證)
// 並且多這麼一步會致使全部類都須要如此寫,不但麻煩並且還要包裝系統自帶不支持的類,故不爲了swift而swift。
// if (!this || this.constructor !== BCSView){
// return new BCSView(element, style)
// }
Function.requireArgumentNumber(1)
this.layer = element
if(typeof style === 'object'){
style.position = 'absolute'
}else{
style = {position:'absolute'}
}
this.setStyle(style)
this.subViews = generateSubViews(this.layer)
/* 方便調試 */
this.layer.setAttribute('view',this.getClass())
}
function BCSView1(style,elementType) {
elementType = elementType || 'div'
var element = document.createElement(elementType)
if(this.constructor === BCSView1){
/*經過new BCSView1構建*/
return new BCSView(element,style)
}else{
BCSView.call(this,element,style)
}
}
複製代碼
從HTML5-Cross-browser-Polyfills 中挑選兼容性較好的補丁,並按照IE的版本分別打包。使用時根據須要調用browser.applyPatches(PatchEnum.Audio,....),全部可用的補丁名稱存放 在PatchEnum中,其中有很多補丁能夠兼容IE6。我沒有所有測試過這些補丁,並且還有部分是我的代碼...如下是驗證過兼容到IE6的補丁清單:html
目前,主流將B/S和C/S當作兩種獨立的架構。本人更願意將B/S當作是一種特殊C/S架構,http協議創建在tcp協議上就是佐證!這也是這個項 目叫作BC/S的緣由。BC/S即Browser client/Server架構的簡稱,即將瀏覽器看做和iOS/Android相似的終端(事實也是如此)。它們的開發思路很相似, 以iOS和前端做爲對比:html css對應iOS的StoryBoard(StoryBoard是xml文件)和配置文件,javascript對應OC/Swift。甚至於javascript有 document.getElementById API,而Android有findViewById....那麼如何在瀏覽器實現先後端分離呢?單頁面應用徹底能夠作到先後端分離,有問題的 是多頁面應用。可否在單頁面應用的基礎上,將json數據傳遞給新打開的頁面呢?答案是確定的。能夠用來在頁面間傳遞數據的有localStorage, sessionStorage,window.name。其中localStorage是全局的不合適;sessionStorage在Chrome打開新頁面的瞬間有bug(不知道算不算),並且IE6 的sessionStorage使用window.name進行兼容,故只能使用window.name。瀏覽器打開新頁面的API爲window.open(url,windowname....)。過程以下:前端
實現代碼以下:html5
BCSViewController.prototype.openWindow = function (pageInfo,windowName,newWindow) {
Function.requireArgumentNumber(arguments,2)
Function.requireArgumentType(pageInfo,'object')
if(pageInfo instanceof Object){
var url,name,object,WindowNameEnum = window.WindowNameEnum
if (pageInfo.url) {
url = pageInfo.url
}else if(pageInfo.pathname){
url = location.href.replace(location.pathname,'') + pageInfo.pathname
}else{
throw new TypeError('invalid url & pathname')
}
windowName = windowName || WindowNameEnum.SELF
newWindow= newWindow ||window.open('',windowName)
if(newWindow){
if (newWindow.name) {
object = JSON.parse(newWindow.name)
}else {
object = {}
}
object[BCSViewController.key] = pageInfo
/*bluebird內部機制未知,但感受會在調用外部函數JSON.stringify時切換以讓出CPU。 此時打開另外一個頁面會致使頁面loadPageInfo執行,目前放在這個位置彷佛能夠順利執行*/
name = JSON.stringify(object)
newWindow.name = name
newWindow.location.assign(url)
}else{
throw new OpenWindowException('Failed to open window.Please check if url is correct ' +// jshint ignore:line
'or popup new window function is blocked!')
}
}else{
throw new TypeError('invalid pageinfo') // jshint ignore:line
}
}
複製代碼
BCSViewController.prototype.loadPageInfo = function (dataURL,errorCallback,method,data) {
var pageinfo,key = BCSViewController.key
if(window.name){
var object = JSON.parse(window.name)
pageinfo = object[key]
if(pageinfo){
try{
delete object[key]
}catch(e){
object[key] = undefined
}
window.name = JSON.stringify(object)
}
}
if(!pageinfo && dataURL ){
method = method || window.HttpMethodEnum.GET
var request = new XMLHttpRequest()
if (request !== null) {
/* window.location.search 用戶可能輸入參數 */
request.open(method, '' + dataURL + window.location.search, false)
request.onreadystatechange = function () {
if (request.readyState === 4) {
switch (request.status) {
case 302:
case 200:
if (request.responseText) {
pageinfo = JSON.parse(request.responseText)
}
break
default:
errorCallback && errorCallback(request.status, request.statusText)
break
}
}
}
request.send(data)
}else{
throw new TypeError('XMLHttpRequest is not supported')
}
}
if(pageinfo && pageinfo.title){
document.title = pageinfo.title
}
return pageinfo
}
複製代碼
優勢:java
缺點:
每一個頁面多一次請求。
示例:src/main/webapp/WEB-INF/html/bcs1.htmlgit
(function () {
var singleton = new Model()
function Model() {
if(singleton){
throw new TypeError(this.getClass() + ' could be instantiated only once!')
}
...
}
Model.getInstance = function () {
return singleton
}
window.Model = Model //export
})()
複製代碼
b.swiftgithub
(function () {
var singleton = new Model()
function Model() {
if(singleton){
throw new TypeError(this.getClass() + ' could be instantiated only once!')
}
...
}
Model['default'] = singleton
window.Model = Model //export
})()
複製代碼
c. Symbol方式web
function Model(){
var map = new ListMap()
//啓用KVO功能
//enableKVO是在Object.prototype中的擴展,故請放棄使用jQuery的想法,也沒有使用jQuery必要!
this.enableKVO(map)
}
複製代碼
BCSView.prototype.setStyle = function (cssObject) {
var cssText = ''
for(var name in cssObject){
if(cssObject.hasOwnProperty(name)){
cssText += name.replace(/([A-Z])/g,function(match){
return '-'+match.toLowerCase()
}) + ":" + cssObject[name] + ';'
}
}
if( typeof( this.layer.style.cssText ) !== 'undefined' ) {
this.layer.style.cssText += ';' + cssText
} else {
this.layer.setAttribute('style',cssText);
}
}
複製代碼
cssObject的內容和React相似:編程
var cssObject = {
bottom:'0px',
width:'100%'
}
複製代碼
看到這裏,作前端的哥們該吐槽了。本人雖然前端代碼寫的少,但也看了很多(右鍵就能看谷歌的css我會亂講?^_^),我的認爲css其實已經臃腫不堪,即 使使用less,stylus並不能改變現狀,由於html的功能愈來愈強大,頁面愈來愈複雜,跟iOS/Android APP並無太大差距。爲何不將特殊樣式直接寫 到元素的內聯樣式中,讓內嵌或者外部樣式只負責通用樣式,例如帶有公司風格的樣式,反而讓內聯樣式白白留空?style.cssText只會讓瀏覽器重繪一次 和設置class效果是同樣的。jQuery對樣式的修改可能也所有都是在內聯樣式中完成的。React和Vue對樣式的處理甚至組件這個概念也是化整爲零的思路, 畢竟同一個組件的元素,外觀,js代碼都在同一個文件中,方便修改。利用document.body生成的BCSView對象做爲全部view的window屬性。
這個項目目前仍是半成品。我最大的問題是作前端的朋友對這個項目有何見解?有沒有應用到實際項目中的價值? 歡迎想貢獻代碼和提供測試幫助的朋友。
項目地址:github.com/Ken-W-P-Hua…