是否有任何"和谐"方法从ES6类实例中获取类名?以外
someClassInstance.constructor.name
Run Code Online (Sandbox Code Playgroud)
目前我指望Traceur的实施.似乎Babel有一个Function.namepolyfill ,而Traceur没有.
总而言之:ES6/ES2015/Harmony中没有其他方式,ES中没有预期的ATM.接下来.
它可以为未经管理的服务器端应用程序提供有用的模式,但在用于浏览器/桌面/移动设备的应用程序中是不需要的.
巴别使用core-js到填充工具Function.name,应当手动加载Traceur和打字稿应用适当.
我发现一些迭代可以重复迭代:
const iterable = {
[Symbol.iterator]: function* () {
yield 1;
yield 3;
yield 5;
}
}
console.log([...iterable]);
console.log([...iterable]);
console.log([...iterable]);Run Code Online (Sandbox Code Playgroud)
虽然有些不能:
function* generatorFn() {
yield 1;
yield 3;
yield 5;
}
const iterable = generatorFn();
console.log([...iterable]);
console.log([...iterable]);
console.log([...iterable]);Run Code Online (Sandbox Code Playgroud)
是否有一个可迭代对象是否应该重复迭代的规则?
我理解为什么它们的行为不同(这是因为第二种情况,当iterable[Symbol.iterator]调用函数时,返回相同的迭代器(它iterable本身。可以尝试iterable[Symbol.iterator]() === iterable,它也会返回true。iterable.next也是一个函数。所以在这种情况下,iterable是一个生成器object、iterable 和 iterator,所有三个)。但我想知道 iterable 作为对象类型,是否有明确定义的行为是否应该或不应该重复迭代。)
什么是检查函数是否是生成器的可靠方法,例如:
let fn = function* () {
yield 100;
}
if (fn instanceof ??) {
for (let value in fn()) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法就是fn.toString().startsWith('function*')那种非常黑客和不可靠的方式
context:nodejs 4+
看起来在任何生成器函数上调用.bind(this)会破坏我查看函数是否为生成器的能力.有想法该怎么解决这个吗?
var isGenerator = function(fn) {
if(!fn) {
return false;
}
var isGenerator = false;
// Faster method first
// Calling .bind(this) causes fn.constructor.name to be 'Function'
if(fn.constructor.name === 'GeneratorFunction') {
isGenerator = true;
}
// Slower method second
// Calling .bind(this) causes this test to fail
else if(/^function\s*\*/.test(fn.toString())) {
isGenerator = true;
}
return isGenerator;
}
var myGenerator = function*() {
}
var myBoundGenerator = myGenerator.bind(this);
isGenerator(myBoundGenerator); // false, should be true
Run Code Online (Sandbox Code Playgroud)