読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

【JavaScript】新しいプロパティの追加を禁止させる

どうも、JavaScript初心者です。
jsを書いていて、ちょっと困ったことがあったのでメモ。

宣言していないObjectのプロパティをレシーバ(使い手)側で新しく追加されるというもの。
レシーバ側が自由な使いかたをされると意図せぬバグを生むことになるので、そのような穴は閉じたいです。

Object.preventExtensionsを使えば、レシーバ側でプロパティを追加されるのを防げます。

Object.preventExtensionsを使ってみる

検証

  • 実装
'use strict';

function Human(name) {
  var name = name;

  this.setName = function(name) {
    name = name;
  };

  this.getName = function() {
    return name;
  };
};

var human = new Human('たろう');
human.name = 'しろう';

console.log(human.getName());
console.log(human.name);

console.log(human);
  • 出力
たろう
しろう
{ setName: [Function], getName: [Function], name: 'しろう' }

getNameが返すname(たろう)の方は、影響はありませんが、このように、name(しろう)という新しいプロパティとして作られてしまいます。

使ってみる

  • 実装
'use strict';

function Human(name) {
  var name = name;

  this.setName = function(name) {
    name = name;
  };

  this.getName = function() {
    return name;
  };

  Object.preventExtensions(this);
};

var human = new Human('たろう');
human.name = 'しろう';

console.log(human.getName());
console.log(human.name);

Object.preventExtensionsという関数を実装します。

  • 出力
human.name = 'しろう';
           ^
TypeError: Can't add property name, object is not extensible

strictモードであれば、TypeErrorを返します。
strictモードでなければ、undefです。