当前位置: 首页 > 面试题库 >

Javascript何时使用原型

赏阳嘉
2023-03-14
问题内容

我想了解何时在js中使用原型方法。应该一直使用它们吗?还是在某些情况下不优选使用它们和/或导致性能下降?

在此站点上搜索js中命名空间的常用方法时,似乎大多数人都使用了基于非原型的实现:简单地使用对象或函数对象来封装名称空间。

来自基于类的语言,很难不尝试绘制相似之处,并认为原型就像“类”,而我提到的命名空间实现就像静态方法。


问题答案:

原型是一种 优化

很好地使用它们的一个很好的例子是jQuery库。每次使用来获取jQuery对象时$('.someClass'),该对象都有数十种“方法”。该库可以通过返回一个对象来实现:

return {
   show: function() { ... },
   hide: function() { ... },
   css: function() { ... },
   animate: function() { ... },
   // etc...
};

但这意味着内存中的每个jQuery对象都会有数十个包含相同方法的命名槽,一遍又一遍。

相反,这些方法是在原型上定义的,并且所有jQuery对象都“继承”该原型,以便以很少的运行时成本获得所有这些方法。

jQuery如何正确实现的一个至关重要的部分是,它对程序员是隐藏的。它纯粹是一种优化,而不是您使用库时要担心的事情。

JavaScript的问题在于,裸露的构造函数要求调用者记住给它们加上前缀,new否则它们通常将不起作用。没有充分的理由。jQuery通过将废话隐藏在普通函数中来实现正确的处理$,因此您不必关心对象的实现方式。

为了使您可以方便地使用指定的原型创建对象,ECMAScript 5包含一个标准函数Object.create。它的一个大大简化的版本如下所示:

Object.create = function(prototype) {
    var Type = function () {};
    Type.prototype = prototype;
    return new Type();
};

它只需要编写一个构造函数,然后使用进行调用即可new

什么时候可以避免使用原型?

与流行的OO语言(例如Java和C#)进行有用的比较。这些支持两种继承:

  • 接口 继承,在那里你implement一个interface这样的类提供了自己独特的实施接口的每一个成员。
  • 实现 继承,您可以extendclass其中提供某些方法的默认实现。

在JavaScript中,原型继承是一种 实现
继承。因此,在某些情况下(在C#或Java中)您将从基类派生以获得默认行为,然后对这些行为进行一些小的修改以通过覆盖,然后在JavaScript中,原型继承才有意义。

但是,如果您处在使用C#或Java接口的情况下,则JavaScript不需要任何特定的语言功能。无需显式声明表示接口的内容,也无需将对象标记为“实现”该接口:

var duck = {
    quack: function() { ... }
};

duck.quack(); // we're satisfied it's a duck!

换句话说,如果对象的每个“类型”都有自己的“方法”定义,则从原型继承没有任何价值。之后,这取决于您为每种类型分配多少个实例。但是在许多模块化设计中,只有一个给定类型的实例。

实际上,许多人已经提出实现继承是邪恶。就是说,如果某个类型有一些通用的操作,那么如果不将它们放到基类/超级类中,而是将它们作为普通函数暴露在某个模块中,然后将对象传递给它们,则可能会更清楚。您希望他们继续操作。



 类似资料:
  • 问题内容: 我注意到在监视/尝试回答常见的jQuery问题时,有一些使用javascript(而不是jQuery)的实践实际上使您能够 编写更少的代码,并且做得 …数量相同。并且还可能产生性能优势。 一个具体的例子 与 在点击事件中引用点击的对象ID jQuery的 Java脚本 还有其他类似的常规做法吗?无需将jQuery混用就可以更轻松地完成某些Javascript操作的地方。还是这是罕见的情

  • 问题内容: 如果重写了JavaScript中的原型方法,则可以调用该基础方法吗? 问题答案: 我不明白您到底想做什么,但是通常按照以下方式完成特定于对象的行为:

  • 我正在尝试修改一个插件(Pikaday)并添加我自己的一点点功能。 这个插件是使用原型系统构建的,我在其中添加了我的函数。 我很难理解的是如何实际触发这个方法。单击指定的元素不起作用。 如果有人感兴趣,这里有完整的代码(减去我的加法)。

  • 目前我正在一个项目中工作,我们正在编写面向对象的JavaScript。在本项目中,我看到了定义类的两种不同方式: 1:在原型上立即声明函数 2:在原型上准备每个功能 基于这两个给定的示例,JavaScript的行为有什么不同吗?还是只是风格上的不同? 就我个人而言,我没有看到任何行为上的差异,但我有一种感觉,那就是一定有一种微妙的差异,而我目前正错过这种差异。 除此之外。我想知道这是一种常见的做法

  • 问题内容: 我想知道在使用selenium时如何禁用javascript,以便可以测试服务器端验证。 我找到了这篇文章,但我不知道该怎么做。就像我制作此javascript文件,然后呢? http://thom.org.uk/2006/03/12/disabling-javascript-from- selenium/ 问题答案: 编辑 在此期间,确实出现了更好的替代方法,请参见其他答案,例如 如

  • 本文向大家介绍如何使用自己的原型访问JavaScript对象?,包括了如何使用自己的原型访问JavaScript对象?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过使用名为“ Object.create() ”的javascript方法创建自己的原型来访问现有对象。使用此方法,我们可以将属性从现有属性继承到新创建的原型。让我们简要地讨论一下。 语法 此方法采用现有对象并创建自己的原型,以便