[英]Why won't console.log show my whole javascript multidimensional array?
[英]why console.log doesn't show values of properties added by PROTOTYPES in javascript when whole object is printed?
我知道Prototype用於添加屬性或方法,而JavaScript對象則從其原型繼承其屬性和方法。
var Person=function (name) {
this.Fname=name;
this.health=100;
};
//create object of Person
var Mateen=new Person("Mateen");
var Fariza=new Person("Fariza");
console.log(Mateen);
console.log(Fariza);
//output { Fname: 'Mateen', health: 100 }
{ Fname: 'Fariza', health: 100 }
//Adding method by prototype
Person.prototype.attack=function attack(target) {
target.health-=2;
}
Fariza.attack(Mateen);
console.log(Mateen);
console.log(Fariza);
//output: { Fname: 'Mateen', health: 98 }
{ Fname: 'Fariza', health: 100 }
//adding proterty by prototype
Person.prototype.level=1;
console.log(Mateen);
//output: { Fname: 'Mateen', health: 98 }
在最后一個輸出中,為什么在打印整個對象時不顯示水平。 它確實顯示了何時使用console.log(Mateen.level)。
(編輯:TL; DR這是由於繼承和原型鏈。console。不會記錄繼承的屬性,但可能會記錄可擴展以找到這些屬性的原型。)
您正在修改原始Person
函數的原型對象,而不是您已創建的實例。 當您控制台記錄實例時,您只是在記錄該實際對象的屬性,而不是那些從原型繼承的屬性。 如果如示例中那樣訪問Mateen
的level
屬性,則Javascript將在對象上查找該屬性,如果找不到,則向下查找原型鏈並在其中找到它
console.log(Mateen.level) // 1 : Value is actually coming from Mateen.__proto__.level
如果您要將屬性顯式添加到Mateen
則它將顯示在console.log中,而Fariza
仍將從原型繼承它。
Mateen.level = 10;
console.log(Mateen); // { Fname: 'Mateen', health: 100, level: 10 }
console.log(Fariza); // { Fname: 'Mateen', health: 100}
console.log(Fariza.level) // 1 : Taken from Fariza.__proto__.level
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.