我试图为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(魔术属性),它总是引用当前类(当前类的范围)的对象。
发布于 2014-11-17 19:33:51
因此,我终于发现,您在sayHello方法中讨论的是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时创建的作用域。
仅仅因为这个作用域问题无疑是令人困惑的(不要担心,它可能会有一段时间)--如果您还没有创建一个作用域(通过使用构造函数或对象文本),那么您将在global作用域中工作,在浏览器的情况下,这个作用域就是Window对象。
发布于 2014-11-17 19:04:55
这是因为您从未创建过一个对象:
var options = {
name: 'No name',
sayHello: function () {
console.log(self.name);
}
}
var user1 = new Class(options);
var user2 = new Class(options);“此”指当前函数的对象所有者。在这种情况下,将是windows对象。至少您可以从function构造一个对象。
如果您希望避免有人覆盖Class.prototype的属性,则在for in中使用hasOwnProperty是必要的
https://stackoverflow.com/questions/26979867
复制相似问题