我对es2016中的class
功能有点困惑,虽然与function
和prototype
相比,它被认为只是创建类的语法糖,但在某些情况下行为是不同的,特别是 - 类不能被称为函数相同,似乎没有办法找出函数是类构造函数还是简单函数,而不使用{{1} }和toString
/^class/
。
假设示例:
RegExp
是class Foo {
constructor () {
this.name = 'foo';
}
}
function Bar () {
this.name = 'bar';
}
function doSmth (anyArg) {
if (typeof anyArg === 'function') {
var obj = { someProp: 'qux' };
anyArg.call(obj);
return obj;
}
// ...
}
doSmth(Bar);
doSmth(Foo); // Class constructor Foo cannot be invoked without 'new'
,但不能将其称为函数!尼斯。
这是我的两个问题:
typeof 'function'
上下文来调用Foo
构造函数与Bar
相同?this
是类的构造函数,我可以在anyArg
函数中以不同方式处理它。没有doSmth
和toString
(,因为在这种情况下性能损失将是巨大的)。然后,我可以使用RegExp
初始化新实例,然后Reflect.construct
使用实例中的值扩展我的Object.assign
变量。谢谢你,Alex
答案 0 :(得分:0)
我不知道如何在第一个问题中做出你的要求。
对于第二个问题,您实际上确定了一种方法来区分自己。类构造函数和用作构造函数的函数之间的区别之一是前者在没有Html Webpack Plugin:
<pre>
TypeError: Cannot read property 'title' of undefined
- index.html:77
D:/projects/living/user-platform/project/src/index.html:77:33
- index.html:94 module.exports
D:/projects/living/user-platform/project/src/index.html:94:3
- index.js:255
[project]/[html-webpack-plugin]/index.js:255:16
- util.js:16 tryCatcher
[project]/[html-webpack-plugin]/[bluebird]/js/release/util.js:16:23
- promise.js:510 Promise._settlePromiseFromHandler
[project]/[html-webpack-plugin]/[bluebird]/js/release/promise.js:510:31
- promise.js:567 Promise._settlePromise
[project]/[html-webpack-plugin]/[bluebird]/js/release/promise.js:567:18
- promise.js:604 Promise._settlePromiseCtx
[project]/[html-webpack-plugin]/[bluebird]/js/release/promise.js:604:10
- async.js:143 Async._drainQueue
[project]/[html-webpack-plugin]/[bluebird]/js/release/async.js:143:12
- async.js:148 Async._drainQueues
[project]/[html-webpack-plugin]/[bluebird]/js/release/async.js:148:10
- async.js:17 Immediate.Async.drainQueues
[project]/[html-webpack-plugin]/[bluebird]/js/release/async.js:17:14
</pre>
关键字的情况下使用它时出错,而后者则没有。
所以,如果我们使用try / catch,我们可以粗略地做你想做的事情:
new
要说清楚,我并不是说这是一个好主意,好的代码,或者它有你正在寻找的性能,但我想我会指出可能存在的可能性。
答案 1 :(得分:0)
两个问题都没有。
以下是Angular 1.x如何检测类:
<amp-accordion>
<section expanded>
<h2 class="myheader">Section 1</h2>
<p>Bunch of awesome content</p>
</section>
...
不幸的是,这是最好的解决方案。它甚至在Firefox中也不起作用。
答案 2 :(得分:0)
如果您担心RegEx的性能损失,请使用substring()
。如果您仍然关注字符串操作的性能,那么请考虑另一种实际区分函数类型的语言。在JavaScript中,他们都是function
。
class Foo {
constructor() {
this.name = 'foo';
}
}
function Bar() {
this.name = 'bar';
}
function doSmth(anyArg) {
if (typeof anyArg === 'function') {
var obj = {
someProp: 'qux'
};
if (anyArg.toString().substring(0, 5) === 'class') {
Object.assign(obj, new anyArg());
} else {
anyArg.call(obj);
}
return obj;
}
// ...
}
var bar = doSmth(Bar);
var foo = doSmth(Foo);
console.log(bar);
console.log(foo);
&#13;