【问题标题】:Understanding prototype and Object了解原型和对象
【发布时间】:2018-09-07 06:53:09
【问题描述】:

我相信他们有几个参考和很好的答案来解释 Javascript 中的原型,

我的问题很简单,当我创建这样的东西时。

function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
}
Person.prototype.nationality = "English";

var myFather = new Person("John", "Doe", 50, "blue");
var myMother = new Person("Sally", "Rally", 48, "green");

console.log myFather 它显示它的名字、姓氏、年龄、眼睛颜色但没有国籍但是当我做这样的事情时..

myFather.nationality显示国籍为“英文”

现在,我在 chrome 控制台日志中运行所有内容,我的问题是为什么默认情况下国籍不会出现在 console.logmyFather 对象中

【问题讨论】:

  • 因为它是继承的。它也不显示 myFather.constructormyFather.hasOwnPropertymyFather.isPrototypeOf,尽管它们(以及更多)都存在:它们通常不感兴趣。

标签: javascript


【解决方案1】:

这里的概念是自己的财产 vs 继承的财产

当您键入myFather.nationality 时,JSVM 首先检查myFather 对象本身是否有一个名为nationality 的属性。如果是这样,那么它将返回。在这种情况下,我们说nationality 是对象的自己的属性。默认情况下,对象没有自己的属性;当您直接将它们分配给对象时,它们会得到它们,例如你在构造函数中做了什么。

如果不是,则检查对象的原型;然后是原型的原型;以此类推,直到它到达基本的Object 原型,此时它停止。如果此链中的一个原型具有名为nationality 的属性,那么您将获得该值。在这种情况下,nationality 是对象的继承属性

当您将对象调试到控制台时,它只打印对象自己的属性。

默认情况下,所有对象都以基本的Object.prototype 作为其原型。如果您定义了一个构造函数,例如Person,那么您使用该函数构造的所有对象(通过调用new Person())都将以Person.prototype 作为其原型。

您可以在此处开始深入阅读:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

【讨论】:

    【解决方案2】:

    因为nationality 不是Person 的“OwnProperty”,而是每个实例化Person 对象的原型的隐式属性。

    如果您需要检查特定对象的属性,请使用函数getPrototypeOf

    function Person(first, last, age, eye) {
      this.firstName = first;
      this.lastName = last;
      this.age = age;
      this.eyeColor = eye;
    }
    
    Person.prototype.nationality = "English";
    
    var myFather = new Person("John", "Doe", 50, "blue");
    
    console.log(Object.getPrototypeOf(myFather))

    【讨论】:

    【解决方案3】:

    nationality 不是直接在 Person 对象上 - 它是原型链上的一个步骤,在原型上。当你console.log它时,点击__proto__,你会看到nationality: "English"

    【讨论】:

    • 您能否推荐一些文档来帮助我深入了解 proto 属性。出于某种原因,我发现 Firefox 的文档太混乱了。
    【解决方案4】:

    试试这个

    console.log(myFather.__proto__);
    

    Javascript 在对象中搜索键,如果没有找到它在对象的 proto 中搜索。如果仍未找到,则在 proto 对象的 proto 中。如果你是新手,我想你会发现这个博客非常有用。

    http://blog.vjeux.com/2011/javascript/how-prototypal-inheritance-really-works.html

    P.S 我知道你不想要任何博客或参考的链接,但相信我,这会真正清除你的概念

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2017-05-21
      • 2016-10-31
      相关资源
      最近更新 更多