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 ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为如果
obj
有定义了[[Set]]
,那么obj[key] = value
就会触发[[Set]]
定义的函数。同意楼上的说法,既然
key in obj
为true,就说明对象上或其原型链上已经存在该属性,那我们为了和obj[key]=value的效果保持一致 (obj[key]=value的默认效果就是) ,就不应该对该属性做任何假设,因该直接复写他
比如出现如下情况就会导致
obj[key] = value
与预期不符,用Test创建出来的实例test上访问到的a为undefined