为什么console.log不';打印整个对象时,是否在javascript中显示原型添加的属性值?
我知道Prototype用于添加属性或方法,JavaScript对象从Prototype继承属性和方法为什么console.log不';打印整个对象时,是否在javascript中显示原型添加的属性值?,javascript,Javascript,我知道Prototype用于添加属性或方法,JavaScript对象从Prototype继承属性和方法 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(Fa
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)。我想这可能取决于浏览器,但在Chrome中,您可以通过直接在控制台中展开
\uuuuuuu proto\uuuuu
-对象来查看它
在Firefox中,您可以单击输出,并在右/底部获得与chrome类似的输出
Safari与Chrome类似
不幸的是,我无法验证IE/Edge我想这可能取决于浏览器,但在Chrome中,您可以通过直接在控制台中展开
\uuuuu proto\uuu
-对象来查看它
在Firefox中,您可以单击输出,并在右/底部获得与chrome类似的输出
Safari与Chrome类似
<>遗憾太长了,读不下去了,我不能验证I/EDGE < P>(Ed:TL;DR是由于继承和原型链。控制台。不记录继承的属性,但可以记录原型,可以扩展找到这些。)< /P>
您正在修改原始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
(太长了,读不下去了。这是由于继承和原型链。控制台。不记录继承的属性,但可以记录原型,可以扩展找到这些。) 您正在修改原始
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
因为在每个对象的原型链上都有一公吨的东西,所以打印这些东西并没有多大帮助。但它不应该只是显示出来,而不管它是否有用。这取决于浏览器。对于
console.log
应该做什么没有官方定义。一些浏览器允许您以交互方式扩展和挖掘原型链;其他人没有。对,事实上我试过intelliJ IDEA和谷歌chrome浏览器都没有显示,所以我想如果有特殊原因的话。感谢您的澄清。请尝试console.dir,而不是console.log,因为每个对象的原型链上都有一公吨的东西,并且打印这些东西都不会有什么帮助。但它不应该只是显示出来,而不管是否有用。这取决于浏览器。对于console.log
应该做什么没有官方定义。一些浏览器允许您以交互方式扩展和挖掘原型链;其他人没有。对,事实上我试过intelliJ IDEA和谷歌chrome浏览器都没有显示,所以我想如果有特殊原因的话。感谢您的澄清。请尝试console.dir,而不是console.log