JavaScript-如何使用;“自我”;来自当前JS类
我尝试为JavaScript创建以下语法:JavaScript-如何使用;“自我”;来自当前JS类,javascript,Javascript,我尝试为JavaScript创建以下语法: var user = new Class({ name: 'No name', sayHello: function () { console.log(self.name); } }); user.sayHello(); // will print "undefined" because "self" isn't visible 我创建了类的这个实现: function Class (_properties
var user = new Class({
name: 'No name',
sayHello: function () {
console.log(self.name);
}
});
user.sayHello(); // will print "undefined" because "self" isn't visible
我创建了类的这个实现
:
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
是一个[窗口对象]
问题:如何修改我的代码以在类实例的所有函数中使用
self
?如果将从外部上下文调用函数,则需要使用self
来不删除上下文
预期结果(我的意思是上面的代码应该按照下面的代码执行):
我实验的目标是使用始终引用当前对象的
self
。因为有时候当我们使用像这样的调用时,$.get('…',function(){console.log(this);})
-这个
被设置为函数本地范围。但是我希望使用self
(magic属性),它总是引用当前类的对象(当前类的范围)
这是因为您从未创建过对象:
var options = {
name: 'No name',
sayHello: function () {
console.log(self.name);
}
}
var user1 = new Class(options);
var user2 = new Class(options);
“this”是指当前函数的对象所有者。在这种情况下,将是windows对象。至少可以从函数类构造一个对象。如果您想避免有人覆盖
类的属性。prototype
对于in而言,在中使用hasOwnProperty
是必要的,因此我最终发现您所说的sayHello
方法中的self
变量给您带来了问题
你需要谷歌JavaScript来定义本教程的范围
——这不是最直观的概念,但一旦你掌握了它,一切都会变得有意义
同时,值得指出的是,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();
Class()
函数前面的关键字new
使其作为构造函数执行,这意味着,在构造函数中,此
将引用其自身的作用域
此外,由于属性sayHello
是要在您创建的作用域内执行的函数,因此可以使用this.name
-因为this
将引用您在实例化新类时创建的作用域
仅仅因为这个作用域毫无疑问是令人困惑的(不用担心,可能会有一段时间)-如果你还没有创建一个作用域(通过使用构造函数或对象文字),你就在全局
作用域内工作,在浏览器的情况下,它是窗口
对象。给它起个别的名字怎么样?我通常使用me=this代码>Class
不返回任何内容。您希望用户成为什么样的人?无论如何,在您的示例中,self
是一个局部变量,与全局self
变量不冲突。请对您的问题提供更好的解释,或更新代码以更好地演示问题。您可能需要以下内容:。由于User
是一个构造函数,您希望Class
返回一个函数。@FelixKling您是对的,我错过了new
语句。我更正了我的代码。这个问题应该以主要基于意见的方式结束。OP想要做的事情毫无意义,而且对于如何解决这个问题似乎有多种意见。这是错误的。当使用new调用函数时,它引用一个新创建的对象。所以他确实创建了一个对象。From:使用指定的参数调用构造函数foo,并将其绑定到新创建的对象
。问题是函数(sayHello
)在构造函数执行之前捕获了self
。因此,self
未定义。亚当斯的回答是正确的。很抱歉我在原始信息中的拼写错误。我实验的目标是使用始终链接到当前对象的self
。因为有时候当我们使用像这样的调用时,$.get('…',function(){console.log(this);})
-如果我使用this
它会显示设置为function范围的this
。但我希望使用始终指向此类对象的链接的self
(magic property)。编辑的原始注释(这一条更好):非常简单:您不能创建始终引用当前对象的magic propertyself
,无论其范围如何。作用域在JS中非常重要-一旦您处于不同的作用域,返回原始作用域的唯一方法就是保留对它的引用(即var self=this
)。无论您试图做什么,都是浪费时间,请按照惯例在需要的时间和地点使用var self=this
。var user1=new User();//TypeError:类不是构造函数(正在计算“new User()”)
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();