【问题标题】:What is the justification behind defining properties of an object on its prototype? [duplicate]在其原型上定义对象的属性背后的理由是什么? [复制]
【发布时间】:2015-12-17 22:43:46
【问题描述】:

我一直认为

的首选替代品
function MyObject ( ... )
{
    this.MyFunction = function ( ... ) { ... } 
    // ... 
}

function MyObject ( ... )
{
    // ... 
}

MyObject.prototype.MyFunction = function ( ... ) { ... } 

我的理解是,在被称为 原型链 的 JavaScript 层次结构的工作方式中,MyObject.prototypeMyObject 派生的对象。在英语中,这是在说什么

“给我一个财产,把它交给我的祖先,然后我将 继承它。”

这似乎是一种非常晦涩且低效的处理方式。来自 C# 背景,我如何看待这就像拥有一个类

class SpecialString : String 
{

}

然后说

好的,我想让SpecialString 有一个函数SpecialFunction,所以 我会进入String 并给它public void SpecialString (...)。现在SpecialString 拥有它!任务完成。

【问题讨论】:

  • 不,继承它的不是MyObject,而是你要创建的所有new MyObject实例
  • 或者换一种说法:MyObject.prototype 不是MyObject 的原型(不是它继承的对象)。 MyObject 是一个构造函数,继承自 Function.prototype - 所有函数的原型对象。
  • 其实JavaScript继承模型比经典模型更高效。 MyObject 的每个实例都有一个指向 MyObject.prototype 的指针,可用于使用每个实例可以共享的方法(这样可以节省大量空间)。

标签: javascript oop prototype


【解决方案1】:

好的,我想让SpecialString 有一个函数SpecialFunction,所以 我会进入String 并给它public void SpecialString (...)。现在SpecialString 拥有它!任务完成。

一点也不!使用您的示例,这就像执行以下操作:

function MyObject ( ... )
{
    // ... 
}
Object.prototype.MyFunction = function ( ... ) { ... }

将方法添加到基础Object,以便通过扩展您的自定义对象也有它。


每个构造函数都有自己的prototype 对象,可以在其中定义类方法。

prototype 是一种定义属性或方法的灵活方式,可以在对象的所有实例之间共享,而无需在每次创建新实例时重新声明和创建新的函数对象。

【讨论】:

    【解决方案2】:

    使用原型,函数在所有实例之间共享。 没有原型,函数就会重复:类的每个实例都有一个函数实例(它不是真正的类,但你明白我的意思)。 你可以说原型上的函数声明比其他方式消耗更少的内存。两者都有一些优点,但原型方式更标准,允许创建更接近 C# 类恕我直言的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-05
      • 2021-10-11
      • 2011-06-28
      • 2022-01-06
      • 2020-03-08
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多