.= 'tag.htm'; break; case 'flag': $pre .= $default_pre .= 'flag.htm'; break; case 'my': $pre .= $default_pre .= 'my.htm'; break; case 'my_password': $pre .= $default_pre .= 'my_password.htm'; break; case 'my_bind': $pre .= $default_pre .= 'my_bind.htm'; break; case 'my_avatar': $pre .= $default_pre .= 'my_avatar.htm'; break; case 'home_article': $pre .= $default_pre .= 'home_article.htm'; break; case 'home_comment': $pre .= $default_pre .= 'home_comment.htm'; break; case 'user': $pre .= $default_pre .= 'user.htm'; break; case 'user_login': $pre .= $default_pre .= 'user_login.htm'; break; case 'user_create': $pre .= $default_pre .= 'user_create.htm'; break; case 'user_resetpw': $pre .= $default_pre .= 'user_resetpw.htm'; break; case 'user_resetpw_complete': $pre .= $default_pre .= 'user_resetpw_complete.htm'; break; case 'user_comment': $pre .= $default_pre .= 'user_comment.htm'; break; case 'single_page': $pre .= $default_pre .= 'single_page.htm'; break; case 'search': $pre .= $default_pre .= 'search.htm'; break; case 'operate_sticky': $pre .= $default_pre .= 'operate_sticky.htm'; break; case 'operate_close': $pre .= $default_pre .= 'operate_close.htm'; break; case 'operate_delete': $pre .= $default_pre .= 'operate_delete.htm'; break; case 'operate_move': $pre .= $default_pre .= 'operate_move.htm'; break; case '404': $pre .= $default_pre .= '404.htm'; break; case 'read_404': $pre .= $default_pre .= 'read_404.htm'; break; case 'list_404': $pre .= $default_pre .= 'list_404.htm'; break; default: $pre .= $default_pre .= theme_mode_pre(); break; } if ($config['theme']) { $conffile = APP_PATH . 'view/template/' . $config['theme'] . '/conf.json'; $json = is_file($conffile) ? xn_json_decode(file_get_contents($conffile)) : array(); } !empty($json['installed']) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . ($id ? $id . '_' : '') . $pre; (empty($path_file) || !is_file($path_file)) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . $pre; if (!empty($config['theme_child']) && is_array($config['theme_child'])) { foreach ($config['theme_child'] as $theme) { if (empty($theme) || is_array($theme)) continue; $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . ($id ? $id . '_' : '') . $pre; !is_file($path_file) and $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . $pre; } } !is_file($path_file) and $path_file = APP_PATH . ($dir ? 'plugin/' . $dir . '/view/htm/' : 'view/htm/') . $default_pre; return $path_file; } function theme_mode_pre($type = 0) { global $config; $mode = $config['setting']['website_mode']; $pre = ''; if (1 == $mode) { $pre .= 2 == $type ? 'portal_category.htm' : 'portal.htm'; } elseif (2 == $mode) { $pre .= 2 == $type ? 'flat_category.htm' : 'flat.htm'; } else { $pre .= 2 == $type ? 'index_category.htm' : 'index.htm'; } return $pre; } ?>javascript - Access private method in an overriden method called from the base class constructor - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Access private method in an overriden method called from the base class constructor - Stack Overflow

programmeradmin1浏览0评论

Consider the following code:

class MyBase {
  constructor(b) {
    this.myOverrideMethod(b);
  }
  myOverrideMethod(b) {}
}
class MyClass extends MyBase {
  constructor(b) {
    super(b);
  }
  myOverrideMethod(b) {
    if (b) {
      this.mySpecificMethod();
    } else {
      this.#myPrivateMethod();
    }
  }
  mySpecificMethod() {
    console.log('mySpecificMethod');
  }
  #myPrivateMethod = () => {
    console.log('#myPrivateMethod');
  };
}
new MyClass(true);  // <-- "mySpecificMethod"
new MyClass(false); // <-- Uncaught TypeError: Cannot read private member #myPrivateMethod 
                    //     from an object whose class did not declare it

Consider the following code:

class MyBase {
  constructor(b) {
    this.myOverrideMethod(b);
  }
  myOverrideMethod(b) {}
}
class MyClass extends MyBase {
  constructor(b) {
    super(b);
  }
  myOverrideMethod(b) {
    if (b) {
      this.mySpecificMethod();
    } else {
      this.#myPrivateMethod();
    }
  }
  mySpecificMethod() {
    console.log('mySpecificMethod');
  }
  #myPrivateMethod = () => {
    console.log('#myPrivateMethod');
  };
}
new MyClass(true);  // <-- "mySpecificMethod"
new MyClass(false); // <-- Uncaught TypeError: Cannot read private member #myPrivateMethod 
                    //     from an object whose class did not declare it

The overridden method of myOverrideMethod() is called in the constructor of the "base" class. Since this points to an instance of MyClass, the overrided method in the derived class is invoked correctly. The regular method of mySpecificMethod() gets called successfully, while invoking the private field of #myPrivateMethod() throws the following "TypeError":

Uncaught TypeError: Cannot read private member #myPrivateMethod from an object whose class did not declare it

The error message does not convey the issue as being a private field access violation, but rather evokes the this does not yet reference an instance of MyClass but still references an instance of MyBase! However, why is that and how to successfully invoke the private method of #myPrivateMethod()?

Share Improve this question edited Apr 15, 2020 at 20:04 asked Apr 15, 2020 at 19:33 user13324009user13324009 1
  • Never call overrideable methods from the constructor, and don't use class fields for methods. – Bergi Commented Apr 15, 2020 at 20:20
Add a ment  | 

1 Answer 1

Reset to default 5

This is only an issue when trying to call the private method during the constructor. I think it's because the child class hasn't yet been fully constructed while in the parent's constructor, so the private method isn't available yet.

See the example below where I call this.myOverrideMethod() from an ordinary method, and the call is allowed.

class MyBase {
  constructor() {
  }
  doit(b) {
    this.myOverrideMethod(b);
  }
  myOverrideMethod(b) {}
}
class MyClass extends MyBase {
  constructor() {
    super();
  }
  myOverrideMethod(b) {
    if (b) {
      this.mySpecificMethod();
    } else {
      this.#myPrivateMethod();
    }
  }
  mySpecificMethod() {
    console.log('mySpecificMethod');
  }
  #myPrivateMethod = () => {
    console.log('#myPrivateMethod');
  };
}
new MyClass().doit(true);
new MyClass().doit(false);

发布评论

评论列表(0)

  1. 暂无评论