JavaScript原型入门指南(一)

在不处理对象的情况下,你不能在JavaScript中走很远。它们几乎是JavaScript编程语言的各个方面的基础。事实上,学习如何创建对象很可能是你开始学习的第一件事。话虽如此,为了最有效地了解JavaScript中的原型,我们将引导我们的内部Jr.developer回到基础知识。

对象是键/值对。创建对象的最常见方法是使用大括号{},并使用点符号向对象添加属性和方法。

简单的讲,在我们的应用中,我们需要创造不止一种动物。当然,下一步是将逻辑封装在函数内部,每当我们需要创建新的动物时,就可以调用该函数。我们将此模式称为FunctionalInstantation,并将该函数本身称为“构造函数类”,因为它负责“构造”新对象。

Functional Instantiation

现在,每当我们想要创建一个新的动物(或者更广泛地说一个新的“实例”),我们所要做的就是调用Animal函数,传递名字和能量值作为参数。这很好,非常简单。然而,你能发现这种模式的弱点吗?我们试图解决的最大的问题是与吃、睡、玩三种方法有关。这些方法不仅是动态的,而且也是完全通用的。这意味着,没有理由像现在这样重新创造那些方法,无论何时我们创造出新的动物。我们只是浪费内存,使每一个动物对象比它需要的要大。你能想出解决的办法吗?如果我们不是每次创建新动物时都重新创建这些方法,而是将它们移动到它们自己的对象上,那么我们可以让每个动物引用该对象呢?我们可以用共享的方法调用这个模式函数实例化,冗长但描述性的。

Functional Instantiation with Shared Methods

通过将共享方法移动到它们自己的对象,并在Animal函数中引用该对象,我们现在解决了内存浪费和过大的动物对象的问题。

Object.create

让我们再一次使用Object.create改进我们的例子。简单地说,Object.create允许您创建一个对象,在失败的查找后,该对象将委托给另一个对象。让我们再一次使用Object.create改进我们的例子。换句话说,Object.create允许您创建一个对象,并且每当对该对象进行失败的属性查找时,它可以查阅另一个对象以查看另一个对象是否具有该属性。不废话。让我们看看一些代码。

因此,在上面的示例中,因为子对象是用Object.create(parent)创建的,所以每当对子对象进行失败的属性查找时,JavaScript都会将查找委托给父对象。在我们的工具集中,我们如何使用它来简化我们的Animal code呢?现在,我们可以使用Object.create来委托animalMethods对象,而不是像现在这样逐个向animal添加所有共享方法。听起来很聪明,我们用共享方法和Object.create 调用这个函数实例化。

所以现在当我们调用leo.eat时,JavaScript将查找leo对象上的eat方法。然后,由于Object.create,该查找将失败,它将委托给animalMethods对象,该对象将找到。

到目前为止,一切都好。不过,我们还可以做出一些改进。为了管理跨实例的方法,必须管理一个单独的对象(animalMethods)。这似乎是一个常见的特性,您希望被实现到语言本身。结果是,这就是你在这里的全部原因-prototype

那么JavaScript中的原型究竟是什么呢?简而言之,JavaScript中的每个函数都有一个引用对象的原型属性。虎头蛇尾,对吧?自己测试一下。

如果不是创建一个单独的对象来管理我们的方法(就像我们用animalMethods方法),我们只把这些方法放在Animal函数的原型上?然后我们所要做的就是使用Object.create来委派到Object.create,我们可以用它来委派给Animal.prototype。我们将称此模式为原型实例化

Prototypal Instantiation

希望你有一个大的“aha”时刻。同样,prototype只是JavaScript中的每个函数都具有的一个属性,正如我们上面看到的,它允许我们在函数的所有实例之间共享方法。我们所有的功能仍然是相同的,但是现在,我们不必为所有的方法管理单独的对象,而只需要使用构建在Animal函数本身中的另一个对象Animal.prototype。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复