在JavaScript中使用什么而不是类?

时间:2017-02-03 08:22:07

标签: javascript ecmascript-6

背景

我是一名开发人员,拥有大约9年的Java和C#背景历史。

在那些语言中,类和分类学分类和对象范例固有。

所以,当ECMA6出现时,我很高兴看到语言课程......我开始在各处使用它们。

问题

事实证明,在JavaScript中使用类是一个陷阱。

  

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

你永远不会真正理解JavaScript。你会认为你这样做,但你不会。

问题

很明显,在看了这个完整的会议后,我意识到我不懂JavaScript

我一生都习惯用OOP格式化课程范例,现在我甚至不知道在哪里寻求帮助,甚至不知道如何开始。

  1. 在JavaScript风格中,你会如何继承代表动物王国?我会使用类Animal,然后使用Class Dog,并实例化狗的对象。这不是JavaScript方式。
  2. 非JavaScvript的一个例子:

    class Animal{
        constructor(aName){
            this.name = aName;
        }
    }
    
    class Dog extends Animal{
        constructor(){
            super(aName);
            this.type = "Furry dog";
        }
    }
    
    let myDog = new Dog("Boby");
    
    1. 这样做的JavaScript方式是什么?
    2. 此时,我正在寻找指导。在尝试之后我找不到任何有用的东西,主要是因为我相信我迷失了以至于我甚至都没有找到正确的东西。

      提前致谢。

1 个答案:

答案 0 :(得分:9)

据我所知,JavaScript是一种基于Prototype的语言,具有一流的功能,您可以阅读here

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

对象构造函数

要制作自己的对象定义,请按以下步骤操作:

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);

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

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!);
};

让我们现在创造一个种族的狗:

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();

原型对象

您可以在示例中看到每个定义都使用the Object prototype。这用于定义对象的方式。您可以将其视为类定义。

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

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

Animal.prototype = {
    name: null,
    age: 0,
    genus: null,
    isWild: true,
    hasName: function() { ... }
    isItWild: function() { ... }
}

要完全理解原型的概念以及它们如何相互继承,您可以查看this

最后的注释

JavaScript是一种多范式语言。您可以使用Object Oriented Programming ParadigmImperative Programming ParadigmFunctional Programming Paradigm,这意味着您可以通过多种不同的方式对同一个应用程序进行编程。

一些有用的链接

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

https://en.wikipedia.org/wiki/Prototype-based_programming

干杯。