在重新看紅寶書的時候。複習到物件導向的程式設計這一章節,重溫了一下物件,原型,屬性這三個核心概念和用法。順便想到,在es6中,可以通過class這乙個關鍵字,用一種清爽的方式來定義乙個類(實際上是乙個物件,但是在語義上當做乙個class)。所以實際上,class實現了構造乙個物件的語法糖。
在es5的時候,定義乙個物件的方法是:
function circle(radius)
circle.draw = function draw(circle, canvas)
object.defineproperty(circle, "circlesmade", ,
set: function(val)
});circle.prototype =
};object.defineproperty(circle.prototype, "radius", ,
set: function(radius)
});
值得關注的點有:
1. 物件的私有屬性和方法,在constructor內部通過this繫結。
2. 物件的公有方法和屬性,通過prototype來繫結。
3. 物件的屬性的getter和setter,如果需要定製,需要通過defineobject()的方式來定義。
明顯這種寫法對於標準的物件導向方式來講,是很不友好的。因此es6中class的定義,本質上是一種語法糖,將物件的定義,用一種「類」的方式寫出來。但是本質上,還是實現了es5的語法。
針對上面的類,如果按照es6使用class來寫,則有以下的寫法:
class circle ;
static draw(circle, canvas) ;
static get circlesmade() ;
static set circlesmade(val) ;
area() ;
get radius() ;
set radius(radius) ;
}
從以上的定義中,可以看到,對於乙個class的定義:
1. 私有屬性還是通過constructor進行傳遞
· 2. 公共的方法和屬性,在constructor的外部定義,同時省略關鍵字function,該方法對應prototype上的方法,所有的例項共享乙個prototype 物件
*3. static方法表明,該方法是定義在類上的。直接通過類來呼叫,而不能通過例項物件來呼叫。這個方法在原來的es5中並不存在,屬於新的特性。
4.getter和setter的定義可以當做乙個特殊的方法,在屬性前面宣告get /set,然後定義自定義的getter和setter。
使用babel,將以上es5的**經過編譯,結果如下:
"use strict";
var _createclass = function () } return function (constructor, protoprops, staticprops) ; }();
function _classcallcheck(instance, constructor) }
var circle = function ()
_createclass(circle, [
}, ,
set: function set(val)
}], [
}, ,
set: function set(val)
}], [,
set: function set(val)
}]
get: function get() , set: function set(val) }]); return circle;}();
讓我們看看babel做了那些事情。根據上文的分析,可以發現定義的屬性有三類,1是私有的屬性,2是公有的屬性和方法,3是靜態的屬性和方法。babel首先遍歷class,將這三類三種屬性分別篩選出來,生成配置項。
私有的屬性直接在function的構造器內部定義。公有的方法,將value設定為function的定義,有自定義getter和setter的屬性,將get和set放在屬性的配置項裡面。這兩類將成為成為公有的屬性和方法,放在prototype裡面。最後一類是靜態屬性和方法,定義在staticprops裡面。將所有的定義和方法區分並且相應的config,最後形成的格式為:
[
}, ,
set: function set(val)
}], [,
set: function set(val)
}]
babel定義了乙個包裝器,接受這些配置項,然後將這些屬性根據config,定義在相應的位置上。這個包裝器的定義如下:
var _createclass = function () // 將屬性定義在target上
} return function (constructor, protoprops, staticprops)
; }();
可以看到這個包裝器做的事情就兩件:
1,如何根據props,配置配置項,並且把根據defineobject,粘到object上。
2,根據配置項的類別,選擇是配置在prototype上,還是類本身身上,從而達到static的目的。
經過這樣的變換之後,可以得到:
Webhook到底是個啥?
伺服器 jenkins servergit serverngrokgithub webhook 在配置jenkins實現前端自動化構建的過程中,對於自動化的過程理解很模糊,只是知道jenkins伺服器,git倉庫和後端應用伺服器這三個概念。答案就是 git webhook機制發出請求,告知jenki...
elemtype到底是個啥?
以前對這個東西的一知半解,今天有時間,查了多方面的資料,總結下 elemtype簡單來說就是 用來更好的替代,他也可以叫做別的名字,比如說 define elemtype int 寫程式,就可以用elemtype來進行替代int,若以後想要改elemtype所定義的資料型別為char,直接 defi...
generator yield到底是個啥
先來乙個函式 function show let gen show gen.next 12 gen.next 5 通過函式我們可以看到,定義a接收了yield傳進來的引數,現在請大家和我玩個遊戲,猜猜看a是幾 好了,不賣關子了,咱們執一下看看 那麼現在反過來就有乙個問題了,可能有些人會說,等會,我有...