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之后,他就会识别数组返回他的结果,
好使吧,
放数字打印数字,放对象打印对象,放数组打印数组。