首页 文章

Javascript是基于原型的语言是什么意思?

提问于
浏览
231

据说Javascript的一个主要优点是它是一种基于原型的语言 .

但是,Javascript基于原型是什么意思,为什么这是一个优势呢?

7 回答

  • 261

    Prototypal inheritance 是一种面向对象的形式 code reuse . Javascript是使用原型继承的唯一[主流]面向对象语言之一 . 几乎所有其他面向对象的语言都是经典的 .

    classical inheritance 中,程序员编写了一个定义对象的类 . 可以从同一个类中实例化多个对象,因此您可以在一个位置使用代码来描述程序中的多个对象 . 然后可以将类组织成层次结构,从而进一步重用代码 . 更通用的代码存储在更高级别的类中,低级类继承该类 . 这意味着对象与同一类的其他对象以及其父类共享代码 .

    prototypal inheritance 表单中,来自其他对象的对象 inherit directly . 关于课程的所有业务都消失了 . 如果你想要一个对象,你只需要写一个对象 . 但代码重用仍然是一件有 Value 的事情,因此允许对象在层次结构中链接在一起 . 在javascript中,每个对象都有一个秘密链接到创建它的对象,形成一个链 . 当一个对象被要求输入它没有的属性时,它的父对象将被询问......不断向上链,直到找到该属性或者直到达到根对象为止 .

    JavaScript中的每个函数(它们都是对象本身)实际上有一个名为“prototype”的成员,它负责在要求对象时提供值 . 拥有此成员允许构造函数机制(通过其从对象构造函数)工作 . 将属性添加到函数对象的原型将使其可用于构造的对象,以及从其继承的所有对象 .

    Advantages

    关于为什么原型继承是代码重用的有利形式,可能没有硬性规定 . 代码重用本身是有利的,原型继承是一种合理的方式来实现它 . 你可能会争辩说原型继承是一个相当重要的代码重用,并且该代码可以在 direct ways 中大量重用 . 但是古典语言当然也能够实现这一目标 .

    Sidenote: @Andrew Hedges提出了一个很好的观点,即实际上有many原型语言 . 它也可以通过增加原型功能的方式扩展一些现代语言 .

  • 48

    基于原型的语言不区分类和对象:它只是有对象 . 基于原型的语言具有原型对象的概念,即用作模板的对象,从该对象获取新对象的初始属性 . 任何对象都可以在创建它时或在运行时指定它自己的属性 . 另外, any object can be associated as the prototype for another object ,允许第二个对象共享第一个对象的属性 .

  • 3

    基于原型的编程是一种面向对象的编程风格,其中不存在类,并且通过克隆作为原型的现有对象来执行行为重用(或基于类的语言中的继承) .

  • 5

    优点/缺点是,我们可以在运行时创建新类型的对象,而无需定义类(静态代码) . 像大多数功能一样,开发人员可以将其变为优势/劣势 .

    上面是可能的,因为对象本质上是java脚本中的函数(闭包) .

  • 10

    您可以创建相同类型的对象,而不是声明类结构,并在您喜欢使用对象的原型时添加到它们的定义中 . 它比正常的做事方式更灵活 .

  • 29

    如果您只是在运行时使用对象而不是在编译时使用类来构建新对象,则可以在不知道任何有关它的详细信息的情况下扩展对象 . 当然,根据使用情况,它可能会很快变得不利 . 我对这里的语言没有任何假设,因此它适用于除了javascript之外的语言,它们不是动态的 .

    myobject.prototype=unkownobject;
    myobject.newproperty=1;
    

    你可以从任何地方获得物体;您自己的代码,来自网络,来自数据库,来自外部链接等 .

    请注意,语言不必像javascript那样实现原型继承 . 在javascript中,一个原型对象仅仅是共享的,它的属性也是共享的 . 另一种方法是将原型的所有属性复制到新对象 . 每种方法在不同情况下都有其优势 . 我喜欢第二个,但它不是javascript的功能 .

  • 5

    在阅读完所有答案之后,这就是结论

    1)直接从其他对象继承对象的继承

    2)那不使用类

    3)也称为基于实例的编程或无类原型的编程

    4)通过克隆用作原型的现有对象来执行行为重用

    5)从新对象用作模板的对象获取初始属性

相关问题