簡體   English   中英

JavaScript有課嗎?

[英]Does JavaScript have classes?

上周我和一個朋友吵架了。 他說 JavaScript 中沒有類之類的東西。

我說過有如你所說的var object = new Object()

他說“因為沒有使用單詞class它不是 class。”

誰是對的?

編輯:2017 年 7 月

JavaScript classes introduced in ECMAScript 2015 are primarily syntactical sugar over JavaScript's existing prototype-based inheritance. The class syntax is not introducing a new object-oriented inheritance model to JavaScript. JavaScript classes provide a much simpler and clearer syntax to create objects and deal with inheritance .

- Mozilla ES6 類: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

從技術上講,“JavaScript 沒有類”這句話是正確的。

盡管 JavaScript 是面向對象的語言,但它不是基於類的語言——它是基於原型的語言 這兩種方法之間存在差異,但由於可以像基於類的語言一樣使用 JavaScript,因此許多人(包括我自己)通常將構造函數簡單地稱為“類”。

Javascript 是一種面向對象的編程語言,但在 2015 年 ECMA 腳本中引入了 6 個類,現在可以像 Java 等其他基於類的語言一樣使用它們。 當然,正如用戶代碼魔術師在他/她的評論中指出的那樣,類在 js 和 java 或其他“基於類”的編程語言中的工作方式之間存在一些深刻的差異。

不過現在在 js 編程中可以使用以下示例代碼:

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


class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}

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

這與經典的基於類的語言有一些共同之處。 問題仍然是這種新技術的瀏覽器支持,目前才剛剛開始。 所以在生產產品上使用它仍然不好。 但我毫不懷疑這個問題會很快得到解決。

因此,問題仍然存在,js 是否因為實現了這個新特性而成為一種基於類的編程語言,或者它仍然是一種面向對象原型的編程語言。

在 Javascript 中幾乎所有東西都是一個object (對象可以從其他對象繼承)。 它沒有經典意義上的classes

雖然您可以通過函數原型來重現傳統類定義/實例化的大部分功能。

在這里聽道格拉斯·克羅克福德 (Douglas Crockford) 的演講:
http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2

他在演講中直接回答了你的問題:

該語言最具爭議的特征是它進行繼承的方式,這與幾乎所有其他現代語言完全不同。 大多數語言都使用類——我稱它們為“經典語言”——JavaScript 沒有。 JavaScript 是類免費的。 它使用原型。 對於那些受過經典訓練的人來說,他們會看語言,他們會說:嗯,這是有缺陷的。 你沒有課,你怎么做事? 你怎么能相信你的程序結構會起作用? 他們永遠不會超越這一點。 但事實證明……

人們所說的“X 語言有類”通常是指支持面向對象編程。

是的,Javascript 是一種面向對象的語言。

來自https://github.com/getify/You-Dont-Know-JS 的You-Dont-Know-JS

第 4 章:混合(上)“類”對象

...

JS 已經有一些類似類的語法元素(比如 new 和 instanceof)有一段時間了,最​​近在 ES6 中增加了一些,比如 class 關鍵字。

但這是否意味着 JavaScript 實際上有類? 簡單明了:沒有

我不會在這里復制和跳過其他部分,但鼓勵閱讀第 3章和第 4 章並運行示例。

https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/this%20%26%20object%20prototypes/ch3.md

https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/this%20%26%20object%20prototypes/ch4.md

當我想到類時,我會想到類型以及類允許我定義新類型的事實。 在 js 中你不能創建新類型。 你可以用原型做各種花哨的 oo 東西,但一切仍然是一個對象的事實確實讓 js 的無類特性成為現實。 我認為人們在談論 js 時使用“類”術語,將 js 作為原型語言與作為經典語言的 js 混淆,甚至比丑陋的新運算符更容易混淆。 簡而言之,僅僅因為 js 是 OO 並不意味着類需要存在。

要添加其他答案,javascript 沒有類,盡管我開始看到將其描述為類之類的語句,但我相信這只會混淆問題。

JavaScript 有原型,而不是類,但它們完成相同的事情,原型是定義對象的對象,因此混淆。

例如,原型是類將在 Java 中管理的私有內部狀態的表示。 JavaScript 沒有像在 Java 中那樣將內部狀態放在一個類中並提供用於操作行為的接口,而是公開了供 JavaScript 程序直接操作的數據結構。

這是我在這個主題上找到的最好的描述,Prototypes 不是 Classes

簡單來說 - 是的。 你只需要 Babel.js 轉譯器,因為除 Chrome 瀏覽器外,所有瀏覽器都不支持它。 JavaScript 類是一種函數。 類是用 class 關鍵字聲明的。 我們使用函數表達式語法來初始化一個函數和類表達式語法來初始化一個類。

下面是一個使用函數的 JavaScript 類示例:

 class Rectangle { constructor(height, width) { this.height = height; this.width = width; } // Getter get area() { return this.calcArea(); } // Method calcArea() { return this.height * this.width; } } const square = new Rectangle(10, 10); console.log(square.area); // 100

盡管 JavaScript 在 ES6 之前沒有類,但在 ES5 中可以通過密封對象(從而使對象不可擴展)來實現類的行為。 在密封的對象中,不能添加新的屬性和方法,並且屬性是不可配置的。 仍然可以設置和讀取屬性 我說類,因為有一個警告。 密封對象的方法定義仍然可以修改。 這是因為仍然可以設置屬性值,除非您將所有方法屬性更改為不可寫——此時您已經使用 ES5 非常接近地重現了類行為。

 class Rectangle { constructor(height, width) { this.height = height; this.width = width; } // Getter get area() { return this.calcArea(); } // Method calcArea() { return this.height * this.width; } } const square = new Rectangle(10, 10); console.log(square.area); // 100

是的。 是的,javascript 有類和對象。 這是使用 javascript/NodeJS 類和對象制作區塊鏈的示例:-

// coded by Alfrick Opidi in Smashing Magazine blog
// https://www.smashingmagazine.com/2020/02/cryptocurrency-blockchain-node-js/

const SHA256 = require('crypto-js/sha256');
const fs = require('fs')

class CryptoBlock{
    constructor(index, timestamp, data, precedingHash=" "){
     this.index = index;
     this.timestamp = timestamp;
     this.data = data;
     this.precedingHash = precedingHash;
     this.hash = this.computeHash();     
    }
    computeHash(){
        return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString();
    }   
}

class CryptoBlockchain{
    constructor(){
        this.blockchain = [this.startGenesisBlock()];     
    }
    startGenesisBlock(){
        return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain, its also called genisis", "0");
    }
    obtainLatestBlock(){
        return this.blockchain[this.blockchain.length - 1];
    }
    addNewBlock(newBlock){
        newBlock.precedingHash = this.obtainLatestBlock().hash;
        newBlock.hash = newBlock.computeHash();        
        this.blockchain.push(newBlock);
    }
}

 let smashingCoin = new CryptoBlockchain();

smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50}));
smashingCoin.addNewBlock(new CryptoBlock(2, "01/07/2020", {sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100}) );
fs.writeFile('genisis.json', JSON.stringify(smashingCoin), function (err) {
    if (err) throw err;
    console.log('Saved!');
  }); 
console.log(JSON.stringify(smashingCoin, null, 4));

Javascript 更像是一種基於 Object 的編程語言,而不是面向 Object 的編程語言。

AFAIK Javascript 使用原型概念,而不是面向對象。 這意味着您不能使用 OOP 的典型概念,如繼承或多態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM