首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用prototype而不是声明对象本身的属性有什么好处吗?

使用prototype而不是声明对象本身的属性有什么好处吗?
EN

Stack Overflow用户
提问于 2012-07-02 13:24:34
回答 6查看 370关注 0票数 9

原型用于声明对象类的属性和方法。使用prototype的一个优点是它保存了内存,因为类的所有实例都指向原型的属性和方法,这些属性和方法保存了内存,并且有效地允许类的所有实例将属性视为静态的。

Prototype通过原型链进行继承。

我的问题很简单。当你可以做的时候,为什么要使用原型:

代码语言:javascript
复制
function car() {
    this.engine = "v8";
}
function mustang() {
    // nm, no good way to inherit without using prototypes
}

是那么回事吗?因此,原型的主要目的有三个:

  1. 保存内存
  2. 提供静态属性
  3. 是引用类型从超类继承的唯一方法。
EN

回答 6

Stack Overflow用户

发布于 2014-01-24 02:38:48

保存内存

是的,当您创建数百个Car实例并且它们都有自己的函数(这些函数有自己的闭包作用域)时,您将消耗更多的内存。

无法找到它的参考,但有人建议Chrome优化使用prototype的构造函数,而不是在构造函数体中使用任何东西的构造函数。

提供静态属性

静态更像Date.now(),每个实例都有来自原型的成员,但是可以在实例上调用。

是引用类型从超类继承的唯一方法。

您可以在Parent.apply(this,arguments);中继承子函数,但它会使扩展父函数变得更加复杂,并且不会使childInstance instanceof Parent成为真。该代码所做的是以要创建的子实例作为调用对象(this)运行父代码。继承通常在两个地方进行。

  1. 在子主体中,Parent.apply(this,arguments);重新使用父实例初始化代码,并使父实例成员成为子实例成员(例如: this.name)。
  2. 将Child.prototype设置为Parent.prototype Child.prototype=Object.create(Parent.prototype);Child.prototype.constructor=Child;的浅拷贝--这将确保共享父成员在子实例(如函数getName)上可用。

下面将更详细地解释这些要点:https://stackoverflow.com/a/16063711/1641941

票数 2
EN

Stack Overflow用户

发布于 2014-01-24 01:54:39

关于你的三点:

  1. 原型不一定更有表现力,特别是对于长或包含许多成员的原型链。原型越小,链越短,浏览器的编译器就越能对其进行优化。最终,这个问题需要针对单个应用程序、它们的个人需求以及被针对的浏览器(性能差异很大)提出。
  2. 根据定义,静态成员需要对象。也就是说,静态成员属于对象本身,而不是特定实例。对象是在JavaScript中创建静态属性的唯一方法。注意,对象文本是一种“特殊”类型的对象,本质上是静态的。
  3. 可以实现自己类型的对象,允许继承(即jQuery.extend)之类的东西,但就引用类型而言,原型是创建继承的唯一方法。
票数 1
EN

Stack Overflow用户

发布于 2014-01-22 13:24:52

原型设计不仅仅是这样。还可以在运行时使用方法和属性扩展类和已经存在的对象实例。

这应该以一种非常容易理解的方式来解释:http://javascript.info/tutorial/inheritance

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11294623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档