JavaScript-相当于PHP类self::

JavaScript - Equivalent of PHP Class self::

本文关键字:self PHP 相当于 JavaScript-      更新时间:2023-09-26

所以我一直在搜索这个,因为无法实现它让我头疼。。。而且似乎没有我所期望的解决方案

假设我们有一个示例PHP类:

<?php 
class SampleClass {
    function doA() {
        echo 'Hello world';
    }
    function doB() {
        $sampleArray = ['Hey', 'You'];
        foreach( $sampleArray as $key => $value ) {
            self::doA();
        }
    }
}
?>

由于foreach循环,此代码将回显Hello World两次。这很好。

现在我有了这个script:

function SectionHandler($appWrap) {
 this.appWrap = $appWrap;
 this.loading = function() {
    this.appWrap.addClass('section-loading').html("<i class='fa fa-refresh fa-2x fa-spin'></i>");
 }
 this.setError = function($info) {
    this.appWrap.addClass('section-error').html($info);
 }
 this.load = function($section) {
  var $fileCheck = $.get($section).success(function(){
    self.loading();
    self.load($section);
  }).fail(function(){
    self.setError('No se pudo cargar los datos especificados desde ' + $section + ' ;');
  });
 }
}

我相信this.loading()不再指向主函数,因为$.get().success()函数。我不知道真正的原因。

问题是this.loading(), this.load(), this.setError()都不起作用。

那么,我如何像使用PHP self::函数一样指向主函数呢。?

--编辑--

正如@Eclectricist所指出的,this.load($section);行将执行直到它失败或出现错误,我将整个检查改为:

var $fileCheck = $.get($section).done(function(response){
 self.appWrap.html(response);
}).fail(function(){
 self.setError('No se pudo cargar los datos especificados desde ' + $section);
});

试试这个:

function SectionHandler($appWrap) {
    var that = this;
    this.appWrap = $appWrap;
    this.loading = function() {
        that.appWrap.addClass('section-loading').html("<i class='fa fa-refresh fa-2x fa-spin'></i>");
    }
    this.setError = function($info) {
        that.appWrap.addClass('section-error').html($info);
    }
    this.load = function($section) {
        var $fileCheck = $.get($section).success(function(){
            that.loading();
            that.load($section);
        }).fail(function(){
            that.setError('No se pudo cargar los datos especificados desde /[ ' + $section + ' ]' ;');
        });
    }    
}

问题是一旦进入函数,this的值就会发生变化。您可以通过在主函数that中声明一个变量来处理它,并在稍后引用它

--编辑--

我想注意的是,that.load($section);行将递归地调用SectionHandler.load(),直到AJAX请求失败,或者直到出现stackoverflow错误。

是的,我一直希望出现一些可以引用该错误的东西:)

您的想法是正确的,但this的上下文可以在另一个函数的范围内更改(在jQuery回调的上下文中也是如此),所以如果您想确保this.loading()始终是您所指向的,那么在JavaScript中,您想将this分配给一个变量,这样您就可以调用特定版本的this的函数。通常称为selfthat。像这样:

function SectionHandler($appWrap) {
    var self = this;
    self.appWrap = $appWrap;
    self.loading = function() {
       self.appWrap.addClass('section-loading')
           .html("<i class='fa fa-refresh fa-2x fa-spin'></i>");
    }
    self.setError = function($info) {
        self.appWrap.addClass('section-error').html($info);
    }
    self.load = function($section) {
        var $fileCheck = $.get($section).success(function(){
            self.loading();
            self.load($section);
        }).fail(function(){
            self.setError('No se pudo cargar los datos especificados' + 
                        ' desde /[ ' + $section + ' ]' ;');
        });
    }
}

您的想法是正确的,因为这里代码中的this不再意味着SectionHandler,而是指$.get($section).success(function()。处理此问题的一种方法是在进入函数之前将this存储在变量中:

function SectionHandler($appWrap) {
    var self = this;
    ...
    this.load = function($section) {
        var $fileCheck = $.get($section).success(function(){
            self.loading();
            ...