一个this的小知识点
(探究jquery的封装是怎么实现连续调用多个方法的,例如:$(div).css({…})…)
var qs = {
a : function () {
console.log("aaa");
return this;//在每个函数的末尾返回this对象,可以实现对象连续调用多个方法
//因为this就是谁调用这个函数,函数里面的this就指向谁。
},
b : function () {
console.log("bbb");
return this;
},
c : function () {
console.log("bbb");
}
}
qs.a().b().c();//aaa bbb ccc
对象访问属性
两种访问对象属性的方法,
一种就是对象.属性-->obj.name
还有一种就是对象[字符串形式的属性名]---->obj['name']
内部原理每当你访问 obj.name 的时候,--------------->本质上系统隐式的访问的是 obj[‘name’];
如果你直接使用这样的方式obj[‘name’]更方便,因为它内部就是这样执行的,这样访问速度更快。
示例:实现输入索引就输出对应索引属性名属性的值(就是实现属性名字符串的拼接)
var q = {
a1 :{name : "dong"},
a2 :{name : "nan"},
a3 :{name : "xi"},
a4 :{name : "bei"},
sayA :function (num){
return this['a' + num];
//实现属性名的拼接,只能用对象['属性名' + ...]的方式
}
}
console.log(q.sayA(1));//Object { name: "dong" }
console.log(q.sayA(2));//Object { name: "nan" }
console.log(q.sayA(3));//Object { name: "xi" }
console.log(q.sayA(4));//Object { name: "bei" }
对象的枚举 for in
var obj = {
name : '13',
age : 89,
sex : "male",
height : 180,
weight : 75
}
for(var prop in obj) {
console.log(prop + " " + typeof(prop));
//name string
//age string
//sex string
//height string
//weight string
console.log(obj.prop); //undefined undefined undefined undefined undefined
//这个时候系统是把prop当做obj的一个属性,因为它没有这个属性所以会输出undefined
console.log(obj[prop]);
用obj[prop]就是正确的,这样就会把它当做一个变量来看,不能加上obj['prop'],prop现在本来就是一个字符串
}
对象的 hasOwnProperty 属性和 in 属性
- hasOwnProperty(),括号里面传进去的是要判断属性名的字符串形式。
hasOwnProperty就是过滤性掉原型上的属性,留下只属于自己的属性
var obj = {
name : '13',
age : 89,
sex : "male",
height : 180,
weight : 75,
__proto__ : {//手动给原型上添加一个属性
lastName : "deng"
}
}
Object.prototype.abc = "123";
for (var prop in obj){
for (var prop in obj){
if(obj.hasOwnProperty(prop)){//过滤性掉原型上的属性
console.log(obj[prop]);//13 89 male 180 75
}
}
for (var prop in obj){
//!hasOwnProperty
if(!obj.hasOwnProperty(prop)){
console.log(obj[prop]);//deng 123
}
}
- in 只能判断这个对象能不能访问到这个属性 ,包括原型上的。
in 的语法格式就是前面就是这个属性的字符串形式,不能直接用属性名,它会识别成变量就不对了。
console.log('height' in obj);//true
console.log('lastName' in obj);//true
console.log(height in obj);//ReferenceError: height is not defined
instanceof 属性
function Person() {
}
var person = new Person();
// A对象 是不是 B构造函数构造出来的?
//看 A对象的原型链上 有没有 B的原型
// A instanceof B
console.log(person instanceof Person);//true
console.log(person instanceof Object);//true
console.log({} instanceof Object);//true
console.log(person instanceof Array);//false
一个小题目:
var arr = [] || {};//区分是数组还是对象
//1,用constructor方法:[].constructor是function Array(), obj.constructor是 function Object()
//2,用instanceof方法:[] instanceof Array是true, obj instanceof Array是 false
//3,用toString,各个构造函数重写了toString方法
Object.prototype.toString.call([]);
Object.prototype.toString = function () {
// 识别this
// 返回相应的结果
}
// obj.toString();