对象的枚举(2)- in与 instanceof以及区分数组,对象的方法

2.in                 *

__proto__ : {
					lastName : "deng",
					//__proto__ : Object.prototype
				}

__proto__里还有系统自带的属性,一旦延申到这里,他是不会遍历的。

我们在写的时候一定把这个属性写成字符串类型的形式,如果存在他就会告诉你true。

说明这个in和hasOwnProperty差不多,那为什么if(obj.hasOwnProperty(pro))不用in呢?说明他俩还是有区别的。

这个in不分青红皂白,你的是你的,你父亲的也是你的。

            var obj = {
				name : "123",
				age : "18",
				sex : "male",
				height : 180,
				weight : 75,
				__proto__ : {
					lastName : "deng",
					//__proto__ : Object.prototype
				}
			}

In他只能判断你这个对象上能不能访问到这个属性。(使用的概率及其低,基本上没什么用)

3.instanceof       *****

A instanceof B:A对象是不是B构造函数构造出来的

比如:

function Person(){
				
			}
			var person = new Person();

person是Person构造函数构造出来的,返回true。

person确实是Person构造函数构造出来的,但是我如果person instanceof Object这样写,

person并不是Object构造出来的,那为什么返回true呢?

这个又为什么呢?

现在得重新定义一下:

     A instanceof B : 看A对象的原型链上有没有B的原型。

,所以这个就错了吧。

现在我typeof([]), ,typeof({}),返回

 

现在给你一个变量,可能是数组或者一个对象,你怎么区分他呢?

 

第一种区分方法:

var obj = {};

第二种区分方法:

 

第三种区分方法:

Object.prototype.toString = function(){

     }

正常的方法是被谁调用obj.toString();

谁调用的他,函数里面的this就是谁,obj.toString();是为了处理前面调用者的,如果是对象调用的他,这个this就是对象,他一定会用这个this去处理这个东西的。

首先是识别this,然后在返回相应的结果,

Object.prototype.toString.call([]);
			Object.prototype.toString = function(){
				//识别this
				//返回相应的结果
			}
			obj.toString();

现在我们用call来执行,让里面的this变成数组,所以这个数组就会替换原来的this,

替换了this之后,他就会识别数组返回他的结果,

好使吧,

放数字打印数字,放对象打印对象,放数组打印数组。

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/83242606