在原型上定义对象属性背后的理由是什么?

时间:2015-12-17 22:43:47

标签: javascript oop prototype

我一直认为这是

的首选替代品
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拥有它!完成任务。

2 个答案:

答案 0 :(得分:2)

  

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

完全没有!使用您的示例,这就像执行以下操作:

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

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

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

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

答案 1 :(得分:0)

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