使用ES6课程很棒,但是我发现自己在任何地方使用this.variable,它总是指我的课程。有没有办法让我的班级中的隐含全局变量暗示this.variable而不是?所以,如果我写'宽度',它将默认为this.width而不是隐含的全局?
或者如果有一些我可能没有意识到的最佳做法可以减少我的“这个”成瘾,我也很乐意阅读。在我目前正在处理的文件中,这些关键字的数量大约是代码行的一半......
答案 0 :(得分:3)
使用构造函数/类和this
只是使用JavaScript的一种方法。 JavaScript是一种多范式语言,是的,完全可以在不使用this
的情况下使用它。一种方法是通过封闭。
考虑这个class
示例:
class Person {
constructor(first, last) {
this.first = first;
this.last = last;
this.things = [];
}
sayHello() {
console.log(`Hi, I'm ${this.first} ${this.last}`);
}
grabThing(thing) {
this.things.push(thing);
}
}
const p1 = new Person("Joe", "Bloggs");
p1.sayHello();
p1.grabThing("thing1");
console.log(p1.first + "'s things: " + p1.things.join(", "));
const p2 = new Person("Suresh", "Kumar");
p2.sayHello();
p2.grabThing("thing2");
p2.grabThing("thing3");
console.log(p2.first + "'s things: " + p2.things.join(", "));
现在,请考虑使用闭包的方法:
function createPerson(first, last) {
const things = [];
return {
sayHello() {
console.log(`Hi, I'm ${first} ${last}`);
},
grabThing(thing) {
things.push(thing);
},
get things() {
return things;
},
get first() {
return first;
},
get last() {
return last;
}
};
}
const p1 = createPerson("Joe", "Bloggs");
p1.sayHello();
p1.grabThing("thing1");
console.log(p1.first + "'s things: " + p1.things.join(", "));
const p2 = createPerson("Suresh", "Kumar");
p2.sayHello();
p2.grabThing("thing2");
p2.grabThing("thing3");
console.log(p2.first + "'s things: " + p2.things.join(", "));
请注意我们如何直接在first
中使用last
和[{1}}函数提供的createPerson
和sayHello
参数,我们只需将things
声明为本地grabThing
关闭的常数。在该示例中,我们还为各种信息提供了getter(first
,last
,things
),因此可以从我们返回的对象中使用它们,但如果有信息我们我想保持私密,我们可以省去吸气剂。 (有些人更愿意将这些明确的功能而不是吸气剂。)
这种方法的一个缺点是sayHello
,grabThing
,getter等的单独函数对象,用于由{{1}创建的每个对象在createPerson
示例中,只有一个class
函数对象,它通过原型继承在sayHello
个对象之间共享。一方面,创建额外的Person
函数对象似乎很浪费;但现代JavaScript引擎重复使用底层函数代码,即使有不同的sayHello
对象,对象在我们的现代世界中相当便宜。
上行是获取私人信息的简便方法,无需使用和管理sayHello
。
(我不是在倡导this
或非class
,只是注意到有选项。)
答案 1 :(得分:1)
我知道这不是推荐的做法,但with声明是OP要求的。
with
允许使用属性作为语句中的变量来解析对象:
var MyClass = /** @class */ (function() {
function MyClass(name, age) {
this.name = name;
this.age = age;
}
MyClass.prototype.whoami = function() {
with(this) {
console.log(name, age);
}
};
return MyClass;
}());
var c = new MyClass("bob", 123);
c.whoami();

with
中存在strict mode
被禁用的问题,这意味着有some contexts where it simply won't work。
ES6课程就是这样一个上下文,所以如果OP想要使用ES6课程,那么with
就会出局。
答案 2 :(得分:0)
回想一下这个古老的问题,随着钩子的发布,答案变得显而易见了,只是不要写类组件而写函数组件:)