对象属性查找&设置,hasOwnProperty,继承

对象属性查找&设置

属性查找原则

  1. 会先在自身上查找,如果没有
  2. 则根据__proto__对应的原型去找,如果没有
  3. 一直找到Object.prototyp,如果没有,那就找不到了。

属性设置原则

只会修改对象自身的属性,如果自身没有这个属性,那么就会添加这个属性,并不会修改原型中的属性。

hasOwnProperty 方法

语法:对象.hasOwnProperty(属性)
作用:判断该属性是否是对象自身的属性,如果是返回true

使用场景举例:使用在for…in遍历对象中,来过滤出对象自身的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Person(name){
this.name = name;
}
Person.prototype.color = "lime";
var p = new Person("xm");

/*console.log("name" in p); // true
console.log("age" in p); // false
console.log("color" in p); // true
console.log("hasOwnProperty" in p); // true*/

// 遍历p对象
for(var k in p){
// 需求:只希望遍历到p对象自身的属性
// 解决方案: 使用hasOwnProperty方法来进行过滤,过滤出对象自身的属性
if(p.hasOwnProperty(k)){
// if成立,说明k变量所代表的属性是p对象自身的
console.log(k);
}
// 不管属性是对象上的还是属于原型链上的,只要是可以被遍历到的属性,都会被遍历到
// console.log(k);
}

继承

在JS中的继承概念非常简单:一个对象自己没有的属性和方法,另一个对象有,拿过来使用,就实现了继承。

继承的目的:让一个对象可以使用另一个对象的属性和方法。

JS常见的几种继承模式:

混入式继承(mixin)

把一个对象中的属性和方法拷贝到另一个对象中。

1
2
3
4
5
6
7
8
var ff = {
name:"hoho",
extend: function(obj) {
for(var k in obj) {
this[k] = obj[k];
}
}
}

原型链继承

一个对象可以访问构造函数的原型中的属性和方法,那么如果想要让一个对象增加某些属性和方法,

只需要把这些属性和方法放到原型对象中即可。这样就实现了继承, 称之为原型链继承

  • 直接给原型增加属性和方法

  • 原型替换(注意:constructor)

  • mixin+原型替换

Object.create

最初是由道格拉斯丶克罗克福德发布的一篇文章提出的,ECMAScript5新增了Object.create()方法来规范化了这种继承。

ES5中新增了一个方法Object.create(),方法会使用指定的原型对象及其属性去创建一个新的对象。

1
2
3
4
//参数:proto 一个对象
//返回值:obj 新对象,新对象的原型就是proto
var obj = Object.create(proto);
console.log(obj);