我注意到,似乎没有明确解释this关键字是什么以及如何在Stack Overflow站点上的JavaScript中正确(和错误地)使用它.
我亲眼目睹了一些非常奇怪的行为,并且无法理解为什么会发生这种行为.
this工作如何以及何时使用?
是否可以在ES6类中创建私有属性?
这是一个例子.我怎样才能阻止访问instance.property?
class Something {
constructor(){
this.property = "test";
}
}
var instance = new Something();
console.log(instance.property); //=> "test"
Run Code Online (Sandbox Code Playgroud) 我已经做了很多搜索和一些游戏,我很确定这个问题的答案是否定的,但我希望JavaScript专家可能有一个技巧可以做到这一点.
JavaScript函数可以由多个属性引用,即使在完全不同的对象上也是如此,因此不存在包含该函数的对象或属性.但是,无论何时实际调用函数,都必须通过单个对象(至少window是全局函数调用的对象)和该对象的属性来完成.
(函数也可以通过函数局部变量调用,但是我们可以将函数局部变量视为作用域的激活对象的属性,因此该情况不是此规则的例外.)
我的问题是,有没有办法从函数体内部获取用于调用函数的属性名称?我不想将属性名称作为参数传递,或者在封闭范围内的变量周围传递,或者将名称存储为保存函数引用的对象的单独属性,并使函数访问该属性的属性的this对象.
这是我想要做的一个例子:
var callName1 = function() { var callName = /* some magic */; alert(callName); };
var obj1 = {'callName2':callName1, 'callName3':callName1 };
var obj2 = {'callName4':callName1, 'callName5':callName1 };
callName1(); // should alert 'callName1'
obj1.callName2(); // should alert 'callName2'
obj1.callName3(); // should alert 'callName3'
obj2.callName4(); // should alert 'callName4'
obj2.callName5(); // should alert 'callName5'
Run Code Online (Sandbox Code Playgroud)
从我的搜索,它看起来就像你可以得到的最接近的arguments.callee.name,但是这不起作用,因为它只返回在定义时固定到函数对象的名称,并且只有当它被定义为命名函数(我的例子中的函数不是).
我还考虑过,也许你可以遍历this对象的所有属性并测试相等性,arguments.callee以找到其值是对函数本身的引用的属性,但这也不起作用(在一般情况下),因为可能是对象自己(或继承)属性集中的函数的多个引用,如我的示例中所示.(而且,这似乎是一种效率低下的解决方案.) …