JavaScript中替代类的使用方式是什么?

14

背景

我是一名开发人员,有大约9年的Java和C#编程经验。

在这些语言中,类和分类体系与对象范式紧密相关。

因此,当ECMA6发布时,我很高兴地看到该语言中有了类... 然后我开始在任何地方使用它们。

问题

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

如果你使用它们,你将永远不知道你有多痛苦。

你永远不会真正理解JavaScript。你会认为你懂,但其实你不懂。

问题

所以清楚地看完这个视频后,我意识到我不懂JavaScript

我整个生命都被类范式格式化了,现在我甚至不知道去哪里寻求帮助,甚至连如何入门都不知道。

  1. 按照JavaScript的风格,你会如何表示动物王国的继承?我会使用一个Animal类,然后再创建一个Dog类,以实例化狗的对象为例。但这不是JavaScript的方式。

以下是非JavaScript示例:

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怎么做呢?

目前为止,我需要一些指导。尝试过后,我发现没有找到有用的东西,主要是因为我觉得我已经迷失了方向,甚至不知道该搜索什么。

提前感谢您的帮助。


5
光谱的两端都有很强烈的声音。在许多用例中,JavaScript中的面向对象编程是可以接受的,但了解其基础的原型系统也是好的。我喜欢Eric Elliot在该问题上的博客文章。 - Tholle
1
关于OO JavaScript,有很多讨论和帮助,但它与强制性的Java或C#开发纪律有很大不同(我是一名C#开发人员),几乎就像它并不存在一样。正如已经提到的,原型编程对于理解非常有用,并且它会给你许多从继承中熟悉的特性。只是不要期望过多的抽象。 - Reinstate Monica Cellio
2
@Rajesh 如果你解释一下为什么它不应该被投票关闭,那会更有成效 :) - Reinstate Monica Cellio
1
在Javascript中,使用继承的面向对象编程与其他语言基本相同,只是没有明确区分“对象”的“惰性”“蓝图”和实际对象之间的概念,而一切都是对象或函数,“类”本质上是一个构造函数,实例化对象是将对象从特定部件按正确顺序组装起来的过程。原型继承的工作原理已经被解释过了。您是否需要更多信息?有没有特定方面还没有涉及到? - deceze
3
推荐免费的(像啤酒一样)阅读:Axel Rauschmayer的《Exploring ES6》和 You Don't Know JS系列。请点击链接阅读。 - Estus Flask
显示剩余13条评论
1个回答

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

现在,实际上这只是一种面向对象编程风格,这意味着你将会使用和思考对象和继承。你只需知道,在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);

现在你已经有了Animal原型。让我们看看如何扩展它的属性以创建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();

原型对象

从这些例子中我们可以看到,每一次定义都使用了Object prototype。这被用来定义一个对象的属性和方法,你可以把它想象成类定义。

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

为了避免每次都写入原型,你可以采取以下做法:

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

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

最后的说明

JavaScript 是一种多范式语言。您可以使用面向对象编程范式命令式编程范式函数式编程范式,这意味着您可以用很多不同的方式编写同一个应用程序。

一些有用的链接

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

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

Cheers.


1
这只是使用原型的一种方式。使用对象构造器并不是必须的,.prototype 属性也不是必需的。 - nils
3
我只是分享了我有限的知识,希望能够帮到你。如果你能做得更好,我鼓励你发布一个答案而不是评论。谢谢你的参与。 - Asier Paz
你自2015年以来就可以在JavaScript中使用类了。 - George Tiganila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接