web-dev-qa-db-ja.com

オブジェクトvsクラスvs機能

私は疑問に思っていました-JavaScriptオブジェクト、クラス、および関数の違いは何ですか?クラスと関数はオブジェクトの一種だと思いますか?

そして、クラスと関数を区別するものは何ですか?または、それらは本当に同じものですか、それらの用語だけが使用方法に応じて変わりますか?

function func() { alert('foo'); } // a function
func(); // call the function - alerts 'foo'
var func2 = function () { alert('hello'); } // acts the same way as 'func' surely?
func2(); // alerts 'hello'

var Class = function() { alert('bar'); }; // a class
var c = new Class(); // an istance of a class - alerts 'bar'

確かに、クラスにはメソッドとプロパティがあり、インスタンス化できます-しかし、その後、古い関数でも同じことができますか?

54
Sean Bone

すでに気づいているはずなので、JavaScriptにはクラスがありません。代わりに、関数呼び出しの前にnewキーワードを付けることにより、JavaScriptの関数をコンストラクターのように動作させることができます。これは constructor pattern として知られています。

JavaScriptでは、プリミティブデータ型(ブール、数値、文字列)、およびundefinedを除くすべてがオブジェクトです。一方、nullは、最初はそうでないと信じていたとしても、実際にはオブジェクト参照です。これがまさにその理由だ typeof null 返却値 "object"

JavaScriptの関数は、Luaの関数テーブルに似ています(つまり、呼び出し可能なオブジェクトです)。したがって、オブジェクトの代わりに関数を使用できます。同様に、配列もJavaScriptのオブジェクトです。一方、オブジェクトは連想配列と考えることができます。

ただし、最も重要な点は、JavaScriptはプロトタイプのオブジェクト指向言語であるため、JavaScriptにはクラスがないということです。これは、JavaScriptのオブジェクトが他のオブジェクトから直接継承することを意味します。したがって、クラスは必要ありません。必要なのは、オブジェクトを作成および拡張する方法だけです。

JavaScriptのプロトタイプ継承の詳細については、次のスレッドを参照してください。 従来のプロトタイプ継承の利点?

51
Aadit M Shah

2015年に更新

Javascriptには、古いブラウザでは使用されないクラスがあります。 enter image description here

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

コンストラクタ、エクステンションなどがあります。

class Cat { 
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Lion extends Cat {
  speak() {
    super.speak();
    console.log(this.name + ' roars.');
  }
}
33
Neoaptt

JSのクラス:

function Animal(){  

    // Private property
    var alive=true;

    // Private method
    function fight(){ //... }   

    // Public method which can access private variables
    this.isAlive = function() { return alive; } 

    // Public property
    this.name = "Joe";
}

// Public method
Animal.prototype.play = function() { alert("Bow wow!"); }

// .. and so on

オブジェクトを作成すると

var obj = new Animal();

他の言語のオブジェクトから期待するように、このオブジェクトは何でも期待できます。それを達成するための努力は、少し異なっていました。 JSの継承 も確認する必要があります。


あなたの質問にもどって、私はそれを次のように言い換えます:

Class  : A representation of a set with common properties.
object : One from the set with the same properties.


var Class = function() {alert('bar');}; // A set of function which alert 'bar'
var object = new Class();               // One of the functions who alert's 'bar'.
15
loxxy

JavaScriptにはクラスがなく、関数は実際にはJavaScriptのオブジェクト(ファーストクラスの市民)です。関数オブジェクトの唯一の違いは、呼び出し可能であることです。

function func() { alert('foo'); } // a function-正しい

func(); // call the function - alerts 'foo'-正しい

var func2 = function () { alert('foo'); } // same as 'func' surely?-いいえ、_func2_は異なるオブジェクトであり、呼び出されたときに明らかに同じことを行います。

var Class = function() { alert('bar'); };-変数Classに名前が保存されていない関数です。

var c = new Class();-Classに保存されている関数を呼び出して、新しい空のオブジェクトをthisとして提供し、そのオブジェクトを返します。 new functionA()として呼び出される関数は、コンストラクターとして機能し、新しく作成されたオブジェクト(this)を準備することが期待されています。あなたの場合-コンストラクタはオブジェクトに対して何もせず、barに警告するだけです。

8
mishik

Javascriptにはクラスはありません。しかし、関数を他の言語のクラスのように動作させる方法があります。

非常に良い説明がここにあります jsでクラスを定義する3つの方法

また、 JavascriptのOOP に関する非常に優れたリファレンスが見つかりました

3
Tala

オブジェクトはJavaScriptの基本型です。つまり、すべてのユーザー定義データ型は何らかの方法でオブジェクトから継承します。したがって、関数またはクラスを定義する場合[現在JSはクラスコンストラクトをサポートしていませんが、ECMAScriptバージョン6で提案されていることに注意してください]、オブジェクトタイプを暗黙的に継承します。

クラスは、論理関数とプロパティを1つのタイプ/エンティティにカプセル化するために実際に使用され、コンストラクタ構文を使用してそれを「新しい」ことができます。したがって、「Customer」クラスを定義すると、複数回インスタンス化でき、各インスタンス/オブジェクトに異なる値を設定できます。プロトタイプを使用してクラスレベルの値を定義すると、値を共有することさえできます。

JSは現時点ではクラスコンストラクトをサポートしていないため、関数は実際には個々のメソッドとして機能するだけでなく、他の関数や型のコンテナとしても機能します。

ECMAScript 6を使用して、C#、Javaなどのような他の言語にあるものと同様に、これらの構成要素を明確に分離できることを願っています。

2
Prasad Honrao

ES6には、次のようなクラスもあります。

//class
class Cat {
    //constructor
    constructor() {
        this.name = 'Snowball';
    }

    //method
    meow() {
        console.log('Hello, nyah! My name is ' + this.name + ' nyah!~');
    }
};
1
ShanaSkydancer