我尝试为JavaScript创建此语法:
var user = new Class({
name: 'No name',
sayHello: function () {
console.log(self.name);
}
});
user.sayHello(); // will print "undefined" because "self" isn't visible
我创建了Class
的实现:
function Class (_properties) {
var self = this;
// copy all properties and methods to this class
for (var _property_name in _properties) {
self[_property_name] = _properties[_property_name];
}
}
但问题出现在self
我希望在每个班级中使用。 self.name
未定义,因为self
是[Window object]
。
问题:如何修改我的代码以在类实例的所有函数中使用self
?如果将从外部上下文调用该函数,则需要self
以不删除上下文。
预期结果(我的意思是上面的代码应该按照以下代码执行):
function Class (_properties) {
var self = this;
// properties
self.name = 'No name';
// methods
self.sayHello = function sayHello () {
console.log(self.name);
};
}
var user = new Class();
user.sayHello();
我的实验目标是使用始终引用当前对象的
self
。因为有时我们使用此类调用$.get('...', function () { console.log(this); })
-this
设置为功能本地范围。但我希望使用self
(魔术属性),它始终是当前类对象的引用 (当前类的范围)
答案 0 :(得分:4)
所以我终于弄清楚你在谈论self
方法中给你带来问题的sayHello
变量。
你需要谷歌JavaScript scope this tutorial
- 它不是最直观的概念,但一旦你明白了,一切都会有意义。
同时,值得指出self
不是JavaScript中的保留字,并且没有做任何特别的事情,但是this
是。
所以你想要的是这样的:
function Class (_properties) {
// copy all properties and methods to this class
for (var _property_name in _properties) {
this[_property_name] = _properties[_property_name];
}
}
var User = new Class({
name: 'No name',
sayHello: function () {
console.log(this.name);
}
});
var user1 = new User();
var user2 = new User();
new
函数前面的关键字Class()
导致它作为构造函数执行,这意味着构造函数this
内部将引用它自己的函数范围。
此外,因为属性sayHello
是要在您创建的范围内执行的函数,所以您可以使用this.name
- 因为this
将引用您创建的范围您实例化了new Class
。
只是因为这个范围的东西无疑令人困惑(不用担心,它可能会持续一段时间) - 如果你还没有创建一个范围(通过使用构造函数或对象文字)你& #39;在global
范围内重新工作,在浏览器的情况下,该范围是Window
对象。
答案 1 :(得分:0)
那是因为你从未创建过一个对象:
var options = {
name: 'No name',
sayHello: function () {
console.log(self.name);
}
}
var user1 = new Class(options);
var user2 = new Class(options);
"这"指当前函数的对象所有者。在这种情况下将是windows对象。至少你从函数Class构造一个对象。
如果您想避免有人在Class.prototype
hasOwnProperty
来覆盖for in
的属性