JavaScript-如何使用;“自我”;来自当前JS类

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

我尝试为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 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 property
self
,无论其范围如何。作用域在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();