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)和类范式进行格式化的,现在我甚至不知道从哪里寻求帮助,甚至不知道从哪里开始。
非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是一种基于原型的语言,具有一流的函数,您可以在这里阅读。
现在。实际上,这只是一种形式的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_编程
干杯。