(1)做爲構造器調用express
利用new
關鍵字能夠不帶括號地調用函數:函數
function Greet() { console.log('hello'); } new Greet; // parentheses are optional in this construct.
new
操做符的語法爲:this
new constructor[([arguments])]
(2)隱性實現 toString 或者 valueOf 的調用prototype
另外一個例子就能夠隱性調用toString
或者valueOf
方法:code
var greet = { toString: function() { return 'hello'; } } greet + ''; // 字符串鏈接會強制性轉化到String類型,這樣就隱性調用了toString
能夠利用這種方式調用任意的函數:對象
function func() { console.log('hello'); } var greet = { toString: func } greet + '';
或者使用 valueOf
:字符串
function func() { console.log('hello'); } var greet = { valueOf: func } +greet;
若是要使用valueOf的話,能夠在Function的原型中完成複寫,這樣也能完成一個函數的傳遞:get
Function.prototype.valueOf = function() { this.call(this); // Optional improvement: avoid `NaN` issues when used in expressions. return 0; };
function greet() { console.log('hello'); } +greet;
(3)Iterators原型
能夠利用*操做符建立一個迭代器,而後在下一個元素被遍歷的時候就會被自動調用了:it
function* func() { console.log('hello'); } var greet = {}; greet[Symbol.iterator] = func; [...greet];
通常來講用迭代器的時候都會附帶一個yield
語句,可是在這邊但願調用某個函數的時候不必定要加上這個語句。上述代碼中是最後一個語句調用了函數,同時也能夠利用解構賦值來進行調用
[,] = greet;
或者使用for ... of結構:
for ({} of greet);
(4)Getters
function func() { console.log('hello'); } Object.defineProperty(window, 'greet', { get: func }); greet;
也能夠利用Object.assign
:
Object.assign(window, { get greet() { console.log('hello'); }}); greet;
全局將 window
對象替換成一個你自定義的全局對象。
(5)Tagged Template Literals
ES6中能夠利用模板字符串的方式調用:
function greet() { console.log('hello'); } greet``;