首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript -如何使用当前JS类中的"self“

问JavaScript -如何使用当前JS类中的"self“
EN

Stack Overflow用户
提问于 2014-11-17 18:58:48
回答 2查看 4.6K关注 0票数 9

我试图为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

我创建了Class的这个实现

代码语言:javascript
复制
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不删除上下文。

预期结果(我的意思是上面的代码应该作为下面的代码执行):

代码语言:javascript
复制
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 (魔术属性),它总是引用当前类(当前类的范围)的对象。

EN

回答 2

Stack Overflow用户

发布于 2014-11-17 19:33:51

因此,我终于发现,您在sayHello方法中讨论的是sayHello变量,它给您带来了问题。

你需要谷歌JavaScript scope this tutorial -这不是最直观的概念,但一旦你得到它,一切都会有意义。

同时,值得指出的是,self在JavaScript中不是一个保留字,没有什么特别之处,但this是。

所以你想要的是这样的:

代码语言:javascript
复制
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对象。

票数 5
EN

Stack Overflow用户

发布于 2014-11-17 19:04:55

这是因为您从未创建过一个对象:

代码语言:javascript
复制
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是必要的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26979867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档