了解原型和对象

时间:2018-03-28 14:20:09

标签: javascript

我相信他们有几个参考和很好的答案在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显示了firstName,LastName,age,eyeColor但没有国籍,但是当我做这样的事情时......

myFather.nationality它显示国籍为“英语”

现在,我正在Chrome控制台日志中运行所有内容,我的问题是为什么默认情况下console.log myFather对象

中没有显示国籍

4 个答案:

答案 0 :(得分:2)

此处的概念是自有属性 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

答案 1 :(得分:1)

因为nationality不是" OwnProperty"相反,Person是每个instatiated 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))




答案 2 :(得分:0)

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

答案 3 :(得分:0)

试试这个

console.log(myFather.__proto__);

Javascript搜索对象中的键,如果没有找到,则会在对象的 proto 中搜索它。如果仍未找到,则在 proto 对象的 proto 中。如果您对此不熟悉,我认为您会发现此博客非常有用。

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

P.S我知道您不希望链接到任何博客或参考,但相信我,这个将真正清除您的概念