es6class语法转化成es5的疑问

// 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 ?

阅读 1.8k
2 个回答

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

同意楼上的说法,既然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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题