我知道Javascript不是真正的OO语言,ECMAScript 6的引入应该可以缓解其中的一些问题,但在Javascript中使用this
关键字真的让我感到困惑,至少在尝试时在Javascript中复制“私有”函数。
请考虑以下代码:
function Person() {
this.name = "Blake";
var sayHi = function() {
console.log("Salutations. My name is " + this.name);
this.name = "Jon";
console.log("Salutations. My name is " + this.name);
this.sayBye();
};
this.callSayHi = function() {
console.log("O hai, my name is " + this.name);
sayHi();
};
this.sayBye = function() {
console.log("Goodbye " + this.name);
};
};
var blake = new Person();
blake.callSayHi();
对于callSayHi()
函数,上下文是调用callSayHi()
或blake
的对象。因此,this
的定义是名为Person
的{{1}}的实例,控制台输出以下内容:
blake
接下来,调用O hai, my name is Blake
函数。此时,我会假设sayHi()
会再次引用this
,但控制台会说出其他意外行为:
blake
接下来,我尝试设置神秘的Salutations. My name is result
引用并再次登录到控制台:
this
但是,此时,我仍然不知道Salutations. My name is Jon
引用了什么,只是我已经在其上分配了一个属性,并且该属性的旧值为this
。< / p>
最后,要检查result
是否引用this
,我会致电blake
,这会给我一个错误:
sayBye()
所以我知道Uncaught TypeError: undefined is not a function
在this
的背景下没有引用blake
;那么sayHi()
指的是什么?它是指this
(范围较窄)还是指sayHi
(范围更广)?
有没有办法让我声明一个上下文为window
但没有明确分配给属性的函数(类似于像Java这样的语言中的“私有”函数)?
最后,一个更一般的问题:如果Person
在我的第一个问题中引用this
,那么window
的定义如何不绑定到this.name
,而是绑定到sayHi
?我创建了一个名为window
的函数,Person
在该上下文中引用this
,但当我创建函数Person
时,sayHi
引用this
} ...?是因为window
被定义为:
sayHi
......而不是:
var sayHi = function() { ... }
答案 0 :(得分:0)
你可能想要的是:
function Person() {
this.name = "Blake";
return this;
};
Person.prototype.sayHi = function() {
console.log("Salutations. My name is " + this.name);
this.name = "Jon";
console.log("Salutations. My name is " + this.name);
this.sayBye();
};
Person.prototype.callSayHi = function() {
console.log("O hai, my name is " + this.name);
this.sayHi();
};
Person.prototype.sayBye = function() {
console.log("Goodbye " + this.name);
};
var blake = new Person();
blake.callSayHi();
所以这里有一些解释:
每个函数都有自己的变量作用域,如果你在函数中定义一个函数,新函数只能在函数中使用,所以它们的上下文来自函数。如果在原型上定义函数,则函数的上下文就是这个。
希望有所帮助