我相信他们有几个参考和很好的答案在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
对象
答案 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/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我知道您不希望链接到任何博客或参考,但相信我,这个将真正清除您的概念