LoginSignup
1
5

More than 5 years have passed since last update.

JavaScript のクラスの書き方のいくつか

Posted at

このポストは、壮大なヤクの毛刈りの最中なので、いつもにまして、私以外には意味のないポストである。JavaScriptのプロトタイプからオブジェクト指向を学ぶこの方の一連のポストから、学ぶ方が効率がいいだろう。

さて、自分のために、その1。JavaScript のクラスの書き方のいくつか。

function Employee(name, baseSalary) {
    this.name = name;
    this.baseSalary = baseSalary;
    this.getSalary = function() {
        return baseSalary * 2 + 1;
    }
}

var emp = new Employee("Tsuyoshi", 100);
console.log(emp.name);
console.log(emp.getSalary());

まずは、これは問題のある書き方。何故かというと、Employee の生成のたびに、getSalary() メソッドも生成されるから。

Tsuyoshi
201

実際、このコードは次のものと同じらしい。

function EmployeeNative(name, baseSalary) {
    var self = {};
    self.name = name;
    self.baseSalary = baseSalary;
    self.getSalary = function() {
        return self.baseSalary * 2 + 1;
    }
    return self;
}

var emp = EmployeeNative("Tsuyoshi", 100);
console.log(emp.name);
console.log(emp.getSalary());

つまり、new キーワードは、オブジェクトを返しているに過ぎない。その時に、この書き方だと、毎回メソッドを作成することになる。オススメは次のもの。

function EmployeePrototype(name, baseSalary) {
    this.name = name;
    this.baseSalary = baseSalary;
}

EmployeePrototype.prototype.getSalary = function() {
    return this.baseSalary * 2 + 1;
}

var emp = new EmployeePrototype("Tsuyoshi", 100);
console.log(emp.name);
console.log(emp.getSalary());

prototype を用いて定義するもの。prototype は、既存のプロトタイプに、後からプロパティ(関数含む)を追加できるもの。ここでは、EmployeePrototype に対して、後から、プロパティを追加している。こうすると、どうなるかというと、新たに

var emp = new EmployeePrototype("Yamada", 200);

みたいなコードを書いたとしても、

function EmployeePrototype(name, baseSalary) {
  var self = {};
  self.name = name;
  self.baseSalary = baseSalary;
  return self;
}

になるので、メモリ効率的にメソッド分だけ有利になる。しかし、プロトタイプがなんであるかは、まだちょっとスッキリしないので、次のポストで掘り下げてみる。

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5