(1)作为组织器挪用
应用new
关键字能够不带括号地挪用函数:
function Greet() {
console.log('hello');
}
new Greet; // parentheses are optional in this construct.
new
操作符的语法为:
new constructor[([arguments])]
(2)隐性完成 toString 或许 valueOf 的挪用
另一个例子就能够隐性挪用toString
或许valueOf
要领:
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的原型中完成复写,如许也能完成一个函数的通报:
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
能够应用*操作符建立一个迭代器,然后鄙人一个元素被遍历的时刻就会被自动挪用了:
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``;