使构造函数参数具有ES6类方法的特权
Making constructor arguments privileged to ES6 class methods
在ES5中,我可以使用这样的工厂模式:
function factory(a) {
return {
say: function() {
return console.log(a)
}
};
}
var instance = factory('hi');
instance.say(); // => 'hi'
instance.a; // => 'undefined'
传递给工厂的参数没有在它创建的对象上设置,因此它对所有方法定义都有特权,但对作者来说不是公共的。
如果我想让这个工厂成为一个ES6类,我该如何以同样的方式显示构造函数参数?
let hack;
class Blah {
constructor(a) {
//bad!
this.a = a;
//but even worse?
hack = a;
//instance method is not a class method
this.yell = () => console.log(a);
}
say() {
console.log(hack);
}
}
let blah = new Blah('hi');
blah.a; // => 'hi'
blah.hack; // => 'undefined'
blah.say(); // => 'hi'
blah.yell(); // => 'hi'
如果我想让这个工厂成为一个ES6类,我该如何以同样的方式显示构造函数参数?
你不能。出于同样的原因,您不能使构造函数参数可用于原型方法:Scope。
您的工厂方法与类所做的非常不同。你不能用一个类来达到同样的效果,这没关系。你不必仅仅因为类的存在就使用它们。
this.yell = () => console.log(a);
这基本上也是你对当前工厂所做的。您正在返回一个具有特定实例方法的新对象,该方法覆盖特定实例特定的值。这是让它发挥作用的唯一真正方法。如果要将原型用于方法,则需要使用this
来存储特定于实例的值,否则prototype
上的方法无法访问该值。
话虽如此,国际海事组织认为,"私人"价值观被高估了,尤其是当你不得不竭尽全力实现这些价值观时。最终,它们只对人类程序员有用,不会意外地"触碰某人的隐私"并扰乱状态。为此,命名约定通常是完全足够的,例如this.__my_private = a
。只是不要触摸__
变量,除非它们是您的。
相关文章:
- 使构造函数参数具有ES6类方法的特权
- 可以“;超级“;可以在子类的方法内部使用,在不直接引用的情况下调用相应的超类方法
- Javascript中的类方法
- 在 Array.map() 中调用类方法
- 从类方法中的 ajax post 函数回调函数更改 javascript 类属性
- 类方法中的上下文作为变量
- 如何将类方法设置为等于多个函数?-Javascript
- 将类方法绑定到类外绑定的事件处理程序内的AJAX成功回调
- Node.JS:类方法作为回调
- 如何从将在html页面中使用的java脚本中调用java类方法
- 在类方法中使用React.js静态
- 在不使用@syntax的情况下修饰ES6类方法
- 如何使用jQuery通过ajax调用php类方法,但不需要任何php处理程序文件
- 从常规ES6类方法中调用静态方法
- crypto-js如何隐藏类方法
- 当使用Q/promises/异步函数时,如何将一个值从一个类方法返回到另一个类
- 使用javascript创建自己的隐藏类方法
- javascript ES6类/方法范围
- 使用 .call/.apply 隐藏类方法
- 覆盖基类的特权方法