gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 04:16:36 25 4
gpt4 key购买 nike

我尝试为 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];
}
}

但问题出在我希望在每个类(class)中使用的 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();

The goal of my experiment is to use self that always is reference to current object. Because sometimes when we use calls like this $.get('...', function () { console.log(this); }) - this is set to function local scope. But I wish to use self (magic property) that always be a reference to object of current class (scope of current class).

最佳答案

所以我终于发现您在谈论 sayHello 方法中的 self 变量,这给您带来了问题。

你需要谷歌 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();

Class() 函数前面的关键字 new 使其作为构造函数执行,这意味着,在构造函数内部 this 将引用它自己的范围。

此外,因为属性 sayHello 是要在您创建的范围内执行的函数,您可以使用 this.name - as this 将引用您在实例化 new Class 时创建的范围。

仅仅因为这个作用域毫无疑问是令人困惑的(别担心,它可能会持续一段时间)——如果你还没有创建一个作用域(通过使用构造函数或对象字面量),你就在里面工作global 作用域,在浏览器的情况下,是 Window 对象。

关于JavaScript - 如何使用当前 JS 类中的 "self",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26979867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com