1. ホーム
  2. ジャバスクリプト

[解決済み】プロトタイプは何のためにあるのか?[重複あり]

2022-04-04 04:44:07

質問

<ブロッククオート

重複の可能性があります。

JavaScriptで'prototype'と'this'の使い分けは?

OK、私はJSにおけるOOPの考え方にやや慣れていないのです。

以下の2つのコードの違いは何ですか?

function animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}

function animal(){
    this.name = 'rover';
}
animal.prototype.set_name = function(name){
    this.name = name;
}

どちらも同じことをするのだから、何が違うの?

どのように解決するのですか?

プロトタイプを使用すると、新しいオブジェクトを作成するたびに、プロトタイプ上のプロパティやメソッドを再作成する必要がないため、オブジェクトの作成が速くなります。

こうすると

function animal() {
    this.name = 'rover'
    this.set_name = function (name) {
      this.name = name
    }
}

set_name メソッドは、動物を作成するたびに作成されます。しかし、これを実行すると

animal.prototype.set_name = function (name) {
    this.name = name
}

このメソッドは毎回再作成する必要はなく、プロトタイプの一カ所に存在します。そのため someAnimal.set_name("Ubu");this のコンテキストが設定されます。 someAnimal と(唯一無二の) set_name メソッドが呼び出されます。


この方法で作成されたメソッドは、プライベートなデータにアクセスすることができます。

function animal() {
    var privateData = 'foo'

    this.name = 'rover'
    this.set_name = function (name) {
        this.name = name
        alert(privateData) //will alert 'foo'
    }
}

Douglas Crockford氏は、このように作成されたメソッドを「特権的」と呼んでいます。