美文网首页前端总结
React 中的 static

React 中的 static

作者: TralafalgarV | 来源:发表于2020-11-20 17:13 被阅读0次

React组件中定义static方法有什么作用呢?

今天与人闲聊,突然想到这个问题。于是在Babel中文网,输入以下代码:

import React from 'react'

export default class App extends React.Component {
  constructor() {
    super()
  }

  static say() {
    console.log('say')
  }

  run = () => {
    console.log('run')
  }

  render() {
    return <div>Hello World.</div>
  }
}

上面代码被转译成ES5,得到的结果如下(只粘贴了关键代码):

var App = /*#__PURE__*/function (_React$Component) {
  _inherits(App, _React$Component);

  var _super = _createSuper(App);

  function App() {
    var _this;

    _classCallCheck(this, App);

    _this = _super.call(this);

    _defineProperty(_assertThisInitialized(_this), "run", function () {
      console.log('run');
    });

    return _this;
  }

  _createClass(App, [{
    key: "render",
    value: function render() {
      return /*#__PURE__*/_react.default.createElement("div", null, "hello world.");
    }
  }], [{
    key: "say",
    value: function say() {
      console.log('say');
    }
  }]);

  return App;
}(_react.default.Component);

可见,static修饰的say函数,作为第三个参数被传入_createClass,之后调用_defineProperties方法。

function _createClass(Constructor, protoProps, staticProps) { 
  if (protoProps) _defineProperties(Constructor.prototype, protoProps); 
  if (staticProps) _defineProperties(Constructor, staticProps); 
  return Constructor;
 }

_defineProperties方法中调用Object.defineProperty方法,将say添加为构造函数的属性。

function _defineProperties(target, props) { 
  for (var i = 0; i < props.length; i++) { 
    var descriptor = props[i]; 
    descriptor.enumerable = descriptor.enumerable || false;   
    descriptor.configurable = true; 
    if ("value" in descriptor) descriptor.writable = true; 
    Object.defineProperty(target, descriptor.key, descriptor); 
  } 
}

所以静态属性是类的属性,而不是类的实例的属性

相关文章

网友评论

    本文标题:React 中的 static

    本文链接:https://www.haomeiwen.com/subject/plediktx.html