es6class语法转化成es5的疑问

发布于 2022-09-12 23:11:47 字数 1852 浏览 19 评论 0

// es6语法
class Test {
  a = 10
  constructor () {
  }
  test () {
      console.log('this is instance test method')
  }
}
// 使用babel转化成es5语法后

"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

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); } }

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

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // 此处为什么使用了 if (key in obj) ...

var Test = /*#__PURE__*/function () {
  function Test() {
    _classCallCheck(this, Test);

    _defineProperty(this, "a", 10);
  }

  _createClass(Test, [{
    key: "test",
    value: function test() {
      console.log('this is instance test method');
    }
  }]);

  return Test;
}();

问题:

function _defineProperty(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}

此处为什么需要使用if (key in obj),为什么不直接使用 obj[key] = value ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情魔剑神 2022-09-19 23:11:47

因为如果obj有定义了[[Set]],那么obj[key] = value就会触发[[Set]]定义的函数。

你另情深 2022-09-19 23:11:47

同意楼上的说法,既然key in obj为true,就说明对象上或其原型链上已经存在该属性,那我们为了和obj[key]=value的效果保持一致 (obj[key]=value的默认效果就是

Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true })

) ,就不应该对该属性做任何假设,因该直接复写他
比如出现如下情况就会导致 obj[key] = value与预期不符,用Test创建出来的实例test上访问到的a为undefined

const o = {set a() {}}
const test = Test.apply(o)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文