(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``;