关于ecmascript 6:在JavaScript中使用什么代替Classes?

What to use instead of Classes in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

背景

我是一个有大约9年的Java和C语言背景的开发人员。

在这些语言中,类和分类分类是对象范式固有的。

所以,当ECMA6出来的时候,我很高兴看到语言课…我开始到处使用它们。

问题

原来在javascript中使用类是一个陷阱。

If you use them, you will go to your grave never knowing how miserable
you are.

你永远不会真正理解javascript。你会认为你有,但你没有。

问题

所以很明显,在看了整个会议之后,我意识到我不懂javascript。

在我的一生中,我都是用面向对象编程(OOP)和类范式进行格式化的,现在我甚至不知道从哪里寻求帮助,甚至不知道从哪里开始。

  • 在JavaScript风格中,您将如何用继承来表示动物王国?例如,我将使用一个类动物,然后使用一个类狗,并实例化狗的对象。这不是JavaScript方式。
  • 非JavaSavrPT的一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Animal{
        constructor(aName){
            this.name = aName;
        }
    }

    class Dog extends Animal{
        constructor(){
            super(aName);
            this.type ="Furry dog";
        }
    }

    let myDog = new Dog("Boby");
  • JavaScript的方法是什么?
  • 在这一点上,我正在寻找指导。在尝试之后,我找不到任何有用的东西,主要是因为我相信我迷路了,以至于我甚至找不到合适的东西。

    事先谢谢。


    据我所知,JavaScript是一种基于原型的语言,具有一流的函数,您可以在这里阅读。

    现在。实际上,这只是一种形式的opp wich,意味着您将工作并思考对象和继承。你只需要知道,在JavaScript中,没有类,而是原型。但请记住。都是关于功能的。

    对象构造函数

    要实现自己的对象定义,您可以这样做:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function Animal() {
        this.name = null;
        this.age = 0;
        this.genus = null;
        this.isWild = true;
    };

    Animal.prototype.hasName = function() {
        return this.name !== null;
    };

    Animal.prototype.isItWild = function() {
        return this.isWild;
    };

    // Here we create an instance of Animal
    var someAnimal = new Animal();
    // Let's give it a name
    someAnimal.name = 'Dobby';
    console.log('Hey there. My pet name is %s', someAnimal.name);
    console.log('is it wild? %o', someAnimal.isWild);

    现在你有了你的动物原型。让我们看看如何扩展其属性以创建狗原型:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Dog() {
        this.genus = 'Canis';
        this.race = 'unknown';
    }

    Dog.prototype = Object.create(Animal.prototype);
    Dog.prototype.constructor = Dog;
    Dog.prototype.bark = function() {
        console.log('rrouff!);
    };

    现在让我们创建一个狗竞赛:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function SiberianHusky(name, age) {
        this.name = name;
        this.age = age;
        this.race = 'Siberian Husky';
    }

    SiberianHusky.prototype = Object.create(Dog.prototype);
    SiberianHusky.prototype.constructor = SiberianHusky;

    // Let's create our Siberian Husky
    var myPet = new SiberianHusky('Bobby', 5);
    // Aww. It is barking!
    myPet.bark();

    原型对象

    您可以在示例中看到,每个定义都在使用对象原型。用于定义对象的方式。你可以把它看作是类定义。

    如何避免原型属性的过度使用

    您可以执行以下操作,而不是每次都写入原型:

    1
    2
    3
    4
    5
    6
    7
    8
    Animal.prototype = {
        name: null,
        age: 0,
        genus: null,
        isWild: true,
        hasName: function() { ... }
        isItWild: function() { ... }
    }

    要完全理解原型的概念以及它们如何相互继承,您可以检查这一点。

    最后音符

    JavaScript是一种多范式语言。您可以使用面向对象的编程范式、命令式编程范式和函数式编程范式,wich意味着您可以以许多不同的方式对相同的应用程序进行编程。

    一些有用的链接

    https://en.wikipedia.org/wiki/javascript

    https://en.wikipedia.org/wiki/prototype-based_编程

    干杯。