Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用ES6语法定义类方法属性_Javascript_Ecmascript 6_Es6 Class - Fatal编程技术网

Javascript 使用ES6语法定义类方法属性

Javascript 使用ES6语法定义类方法属性,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,在ES5语法中,一个类Foo的方法bar具有一个属性flag,可以定义如下: 函数Foo(){}; Foo.prototype.bar=function(){console.log('bar invoked');}; Foo.prototype.bar.flag=true; 我可以混合ES5和ES6语法并执行以下操作: class-Foo{ bar(){ log('bar invoked'); }; }; Foo.prototype.bar.flag=true; 或者仅使用ES6语法执行以下

在ES5语法中,一个类
Foo
的方法
bar
具有一个属性
flag
,可以定义如下:

函数Foo(){};
Foo.prototype.bar=function(){console.log('bar invoked');};
Foo.prototype.bar.flag=true;
我可以混合ES5和ES6语法并执行以下操作:

class-Foo{
bar(){
log('bar invoked');
};
};
Foo.prototype.bar.flag=true;
或者仅使用ES6语法执行以下操作:

class-Foo{
bar(){
this.bar.flag=true;
log('bar invoked');
};
};

如果必须选择,我会选择第二个选项,但我不喜欢在定义中包含方法名称的冗余。有更好的方法吗?

在JavaScript中没有声明性的方法在方法上创建属性(这是一件非常罕见的事情),因此如果您想这样做,您必须像第二个示例那样在事后进行。(或者你的第三个,但每次调用
bar
时都会重复,所以这有点误导和/或可能没有那么有用。)

如果你可以超越ES2015,并且不害怕使用实验性的东西,你可以与装饰师一起玩


使用严格模式无法引用正在调用的函数(请记住,使用类会使严格模式自动)

如果您想使用ES5“类”实现这一点:


请记住,
参数。被调用方
在严格模式下被禁用。

将属性附加到函数通常非常罕见。把它们和方法联系起来更为罕见。事实上,这可能是我第一次看到这个。你确定你真的需要上课吗?具有类,其中方法也带有属性。你确定这是吗?@VLAZ谢谢你的评论。这不是我从头开始写的课程。我可以为类中的每个方法使用一个对象来设计更好的解决方案,但我已经有了这样定义的ES5类,并且希望将其迁移到ES6语法中。重构可能会在以后出现:)如果是这样的话,我建议使用解决方案2。它是最干净、最接近原始的。还要注意的是,第三个选项与其他两个选项的结果不同,因为它仅在实际调用
obj.bar()
时设置标志。其他人在初始化时设置了标志,非常好!装潢师已经反复更改,并且还会再次更改,但总有一天,他们会完成此过程…:-)(你是否能够在最终结果的情况下做到这一点还有待观察,但仍然有很好的观点。)是的,这项提案似乎还远远不够稳定。但目前的迭代看起来很有希望。至少他们进入了第二阶段哦,之前所有的方案迭代都进入了第二阶段,其中一个简单地进入了第三阶段,然后实施者说,基本上,“我们不能让它执行”,然后又回到了第二阶段。(为了清楚起见:我并不是在这里给提案背后的人一段艰难的时光,我非常尊敬丹·埃伦伯格,我曾与他(以一种非常次要的方式)在装饰师和其他方面合作,他帮助我完成了我新书的第一章。这是一条非常艰难的道路。)
class Foo {
  @flag
  bar() {
    console.log('bar invoked');
  };
};

function flag(target) {
  target.descriptor.value.flag = true;
  return target;
}


const foo = new Foo()

console.log(foo.bar.flag)
function Foo() {};
Foo.prototype.bar = function() {
  console.log('bar invoked');
  arguments.callee.flag = true;
};