Serials Javascript Style Guide – Objects

  Javascript    —  2019, May 27    

Objects

3.1 No new

Sử dụng cú pháp nguyên thủy khi tạo mới 1 object. eslint: no-new-object

// bad
const item = new Object();

// good
const item = {};

3.2 Computed properties

Sử dụng computed property names khi tạo mới object với tên thuộc tính động.

Tại sao ư? Tập trung định nghĩa các thuộc tính của object vào 1 chỗ.


function getKey(k) {
  return `a key named ${k}`;
}

// bad
const obj = {
  id: 5,
  name: 'San Francisco',
};
obj[getKey('enabled')] = true;

// good
const obj = {
  id: 5,
  name: 'San Francisco',
  [getKey('enabled')]: true,
};

3.3 Object shorthand

Hãy sử dụng shorhand cho các medthod của Object. eslint: object-shorthand

// bad
const atom = {
  value: 1,

  addValue: function (value) {
    return atom.value + value;
  },
};

// good
const atom = {
  value: 1,

  addValue(value) {
    return atom.value + value;
  },
};

3.4 Object concise

Sử dụng shorhand cho thuộc tính. eslint: object-shorthand

Tại sao ư? Nó ngắn hơn và gợi tả hơn.

const lukeSkywalker = 'Luke Skywalker';

// bad
const obj = {
  lukeSkywalker: lukeSkywalker,
};

// good
const obj = {
  lukeSkywalker,
};

3.5 Grouped shorthand

Nhóm các thuộc tính shorthand khi bắt đầu khai báo object.

Tại sao ư? Đơn giản vì dễ dàng thấy được các thuộc tính nào sử dụng shorthand thôi.

const anakinSkywalker = 'Anakin Skywalker';
const lukeSkywalker = 'Luke Skywalker';

// bad
const obj = {
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  lukeSkywalker,
  episodeThree: 3,
  mayTheFourth: 4,
  anakinSkywalker,
};

// good
const obj = {
  lukeSkywalker,
  anakinSkywalker,
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  episodeThree: 3,
  mayTheFourth: 4,
};

3.6 Quoted props

Chỉ nên quote những thuộc tính không valid. eslint: quote-props

Tại sao ư? Vì tính dễ đọc, syntax highlight và dễ dàng được tối ưu bởi nhiều engines JS khác.

// bad
const bad = {
  'foo': 3,
  'bar': 4,
  'data-blah': 5,
};

// good
const good = {
  foo: 3,
  bar: 4,
  'data-blah': 5,
};

3.7 Prototype builtins

Không gọi trực tiếp phương thức Object.prototype như hasOwnProperty, propertyIsEnumerable, và isPrototypeOf. eslint: no-prototype-builtins

Tại sao ư? Những phương thức này có thể bị che khuất bởi các thuộc tính trên object trong question - consider { hasOwnProperty: false } - hoặc, object có thể là null object (Object.create(null)).

// bad
console.log(object.hasOwnProperty(key));

// good
console.log(Object.prototype.hasOwnProperty.call(object, key));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
// ...
console.log(has.call(object, key));

3.8 Rest spread

Nên sử dụng toán tử spread hơn là Object.assign để copy object. Sử dụng toán tử rest để lấy object mới với các thuộc tính được bỏ qua.

// very bad
const original = { a: 1, b: 2 };
const copy = Object.assign(original, { c: 3 }); // this mutates `original` ಠ_ಠ
delete copy.a; // so does this

// bad
const original = { a: 1, b: 2 };
const copy = Object.assign({}, original, { c: 3 }); // copy => { a: 1, b: 2, c: 3 }

// good
const original = { a: 1, b: 2 };
const copy = { ...original, c: 3 }; // copy => { a: 1, b: 2, c: 3 }

const { a, ...noA } = copy; // noA => { b: 2, c: 3 }