用啥来代替 JavaScript 中的类? [复制]
Posted
技术标签:
【中文标题】用啥来代替 JavaScript 中的类? [复制]【英文标题】:What to use instead of Classes in JavaScript? [duplicate]用什么来代替 JavaScript 中的类? [复制] 【发布时间】:2017-06-20 13:24:01 【问题描述】:背景
我是一名开发人员,在 Java 和 C# 方面拥有大约 9 年的背景历史。
在那些语言中,类和分类是对象范式所固有的。
因此,当ECMA6 出现时,我很高兴看到该语言的课程......我开始在任何地方使用它们。
问题
事实证明,在 javascript 中使用类是一个陷阱。
If you use them, you will go to your grave never knowing how miserable you are.
而且你永远不会真正理解 JavaScript。你会认为你有,但你没有。
问题
很明显,看完这个完整的会议后,我意识到我不懂 JavaScript。
我的一生都被 OOP with classes 范式格式化,现在我什至不知道从哪里寻求帮助,甚至不知道该从哪里开始。
-
在 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");
-
JavaScript 的实现方式是什么?
此时,我正在寻求指导。在尝试之后,我找不到任何有用的东西,主要是因为我相信我迷失了方向,以至于我什至没有寻找正确的东西。
提前致谢。
【问题讨论】:
频谱两边都有非常强烈的声音。对于许多用例,OOP 在 JavaScript 中都很好,但是了解底层原型系统是很好的。在这件事上我喜欢Eric Elliot's blog posts。 有很多关于 OO Javascript 的讨论和帮助,但它与 Java 或 C#(我是 C# 开发人员)的强制规则如此不同,以至于它几乎不存在。如前所述,原型设计有助于理解,它将为您提供许多您熟悉的继承特性。只是不要期望太多抽象。 @Rajesh 他要求讨论 - 不是解决方案的推荐(图书馆、第 3 方解决方案等)。这完全在 SO 问题的范围内。 @Rajesh 解释为什么它不应该获得接近投票会更有成效:) 推荐的免费(如啤酒)阅读:@AxelRauschmayer 和You Don't Know JS 系列的Exploring ES6。 【参考方案1】:据我所知,JavaScript 是一种基于原型的语言,具有一流的功能,您可以阅读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);
现在您有了 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();
原型对象
您可以在示例中看到每个定义都使用the Object prototype。那是用来定义一个对象是怎样的。您可以将其视为类定义。
如何避免过度使用原型属性
您可以执行以下操作,而不是每次都写入原型:
Animal.prototype =
name: null,
age: 0,
genus: null,
isWild: true,
hasName: function() ...
isItWild: function() ...
要全面了解原型的概念以及它们如何相互继承,可以查看this。
最后的笔记
JavaScript 是一种多范式语言。您可以使用Object Oriented Programming Paradigm、Imperative Programming Paradigm 和Functional Programming Paradigm,这意味着您可以用很多不同的方式对同一个应用程序进行编程。
一些有用的链接
https://en.wikipedia.org/wiki/JavaScript
https://en.wikipedia.org/wiki/Prototype-based_programming
干杯。
【讨论】:
这只是使用原型的一种方式。完全不需要使用对象构造函数,.prototype
属性也不需要。
我只是分享了我的拙劣知识,试图提供帮助。如果您能做得更好,我鼓励您发布答案而不是评论。感谢您的意见。
你从 2015 年开始就在 Js 中上课以上是关于用啥来代替 JavaScript 中的类? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在我的 Qt 应用程序中,我可以用啥来代替 sleep 和 usleep?