簡體   English   中英

綁定一個類會失去它的靜態屬性

[英]Binding a class loses it's static properties

給定

class someClass {
  constructor (str) {
    console.log('created', str);
  }
  static someStatic() {
  }
}

我們可以做的

const someBoundClass = someClass.bind(someClass, 'xxx');
const a = new someBoundClass(); // logs 'created xxx'
console.log(someClass.someStatic) // logs someStatic () {}
console.log(someBoundClass.someStatic) // logs undefined

導致我無法訪問綁定類上的靜態屬性的幕后發生了什么? 有什么方法可以在不損失靜態方法的情況下實現所需的綁定效果嗎?

好的bind會創建一個新的函數對象,因此我不確定為什么您會期望它具有相同的靜態屬性。 請記住,ES6 class主要是語法糖:

function someClass(str) {
  if (!new.target) throw "constructor must be called with new";
  console.log('created', str);
}
someClass.someStatic = function() {};

var someBoundClass = someClass.bind(null, 'xxx');
console.log(someBoundClass === someClass) // false, of course

解決方法是,您可以使用子類化:

class someBoundClass extends someClass { constructor(...args) { super('xxx', ...args); }}
const a = new someBoundClass(); // logs 'created xxx'
console.log(someClass.someStatic) // logs someStatic () {}
console.log(someBoundClass.someStatic) // logs someStatic () {}

someBoundClass這里繼承靜態屬性someClass

看看Javascript靜態與實例,原型關鍵字

在為對象設置屬性,使用static與將方法添加到對象的每個實例之間有區別,這可以通過使用someClass.prototype.someMethod或在您的情況下通過刪除static

這意味着undefined也會發生,如果您嘗試調用someStatic上的實例someClass ,這是直接被實例化new someClass("xxx")

對於另一種方法,請看一下Bergi的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM