JavaScript - 如何使用当前JS类中的“self”

时间:2014-11-17 18:58:49

标签: 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的实现:

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 (魔术属性),它始终是当前类对象的引用 (当前类的范围)

  

2 个答案:

答案 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的属性