具体代码如下:
var num1={
toLocaleString:function(){
console.log('num1');
},
'name':"Tom"
};
var num2={
toLocaleString:function(){
console.log('num2');
},
'name':"Tom2"
};
var num=[num1,num2];
num.toLocaleString();//结果打印出来 num1 和 num2
console.log(num.name);//undefined
为什么数组不可以使用子对象里的属性,但是可以调用子对象里的方法
console.log(num[0].name);
console.log(num[1].name);
你的代码并没有调到子对象的方法
你调的是num
的__proto__
的toLocaleString
方法,而此方法指向Array.prototype.toLocaleString
关于此方法的实现参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/toLocaleString
你这段代码有点迷惑性,你如果把num1、num2的方法名toLocaleString改为其他的名字就报错了
var num1={
foo:function(){
console.log('num1');
},
'name':"Tom"
};
var num2={
foo:function(){
console.log('num2');
},
'name':"Tom2"
};
var num=[num1,num2];
num.foo();//Uncaught TypeError: num.foo is not a function
因为所有的对象都具有toLocaleString()这个方法,内置的。
当调用数组的toLocaleString()方法,它会创建一个数组值的(以逗号分隔的)字符串;为了取得每一项的值,调用的是每一项的toLocaleString()方法。而这个时候你的子对象中恰好有这个方法(覆盖了原型链上的),所以就顺利执行了。
表面上看是数组调用了子对象的方法,实际上是因为数组具有内置的toLocaleString()方法。