关于oop:了解javascript中的Prototype

understanding Prototype in javascript

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How does JavaScript .prototype work?

来自Java背景,我正在尝试理解JavaScript。

请告诉我这些是否正确。

  • 就像在Java中,有一个最高对象,所有其他对象都继承它。
  • 原型属性就像指向父对象(Java中的类)的指针。
  • 对于"对象"对象,原型为空。
  • Prototype属性的值是表示对象命名的字符串,而不是C中的指针。指针概念是使用脚本中不可访问的隐藏属性[[Prototype]]实现的。
  • 我使用node.js而不是browser来学习js。我试过了,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var human = Object.create(null);  // same as var human;
    console.log(Object.getPrototypeOf(human)); //null

    var man  = Object.create(human);
    console.log(Object.getPrototypeOf(man));
    //{}
    //expected 'human'

    var person = Object.create(Object.prototype); // same as var person = {}
    console.log(Object.getPrototypeOf(person));
    //{}
    //expected 'object'


    首先,imo,不要从node开始。如果您还不知道javascript,节点会将您拖到一个流媒体池中。第二,当我开始使用基于函数的代码时,然后是OO,然后才转到原型。但如果你真的想知道,这个问题已经在这里得到了解答。如果您还有什么问题,请随时问我!


  • 是的,但不继承任何东西的Object.create(null)除外。
  • 不确定"父对象"是什么,但函数的原型由实例可访问的函数组成。因为Object.prototype.toString存在,所以{}.toString也是继承的。
  • 是的,原型链到此结束。
  • 不,.prototype(或Object.getPrototypeOf返回的值)是一个可以用属性扩展的对象,因此这些属性是由实例继承的。
  • 你的例子:

    1
    var human = Object.create(null);  // same as var human;

    不,它创建了一个不从任何东西继承的空对象。var human;human设置为undefined,它不是对象,而是原始值(并非所有内容都是javascript中的对象)。

    1
    2
    3
    4
    var man  = Object.create(human);
    console.log(Object.getPrototypeOf(man));
    //{}
    //expected 'human'

    Object.getPrototypeOf(man)返回对象human。这是一个空对象;节点将其显示为{}。它不是字符串。事实上,对象可以分配给多个变量。对象没有绑定到它的变量,因此根据设计,根本无法获取字符串。为了检查相等性,您可以执行Object.getPrototypeOf(man) === human,生成true

    1
    2
    3
    4
    var person = Object.create(Object.prototype); // same as var person = {}
    console.log(Object.getPrototypeOf(person));
    //{}
    //expected 'object'

    这确实与{}相同——一个直接从Object继承的空对象。如上所述,原型是Object.prototype,而不是字符串。它看起来是空的,但这是因为Object.prototype的函数在默认情况下是可用的,并且是隐藏的。


    首先,您需要先阅读有关create方法的信息,然后再尝试使用它。

    其次,以以下方式调用对象:

    1
    var human = {}, man = {}, person = {};

    第三,这不是Java。在Java类中,对类的理解非常重要。原型在JavaScript中是完全可选的。原型提供的唯一性能优势是,当您的代码在不同的范围内通过引用大量重用函数时。如果这种类型的编码不适用于您,那么您可能不需要使用原型。

    原型继承自父对象或某些父对象。JavaScript解析器将首先查找本地分配,如果不存在本地分配,则将检查当前对象的原型是否存在命名引用。简而言之,在编写JavaScript的早期阶段,您需要知道的就是这些。