原型链查找属性的顺序 + 原型链的三角关系

原型:是一种关系,实例对象和原型对象的一种关系,关系是通过原型来联系的

原型链: 任何一个对象都有 __proto__ 属性, 指向了原型对象,原型对象也是对象,也有__proto__ 属性,指向了自己的原型对象,这样形成的链式结构叫做原型链。

先要了解:

(1)实例对象中有__proto__原型。指向了构造函数的prototype的

(2)函数中有prototype原型,指向的是某个构造函数的prototype

(3)prototype这个对象中也有__proto__属性

(4)任何原型链上都有Object.prototype。

(4)原型的作用:通过构造函数创建的实例对象,可以访问构造函数的prototype属性上任意成员

比如:

        //比较是不是一个数组
        console.log([] == []); //false
        console.log(Array.prototype);
        console.log([].push == [].push); // true
        // 总结: 
        // 比较的是push方法,是否是同一个
        // push 方法存在于数组的原型上
        // 访问数组的原型 :  Array.prototype
        // []是 实例, 就可以访问数组的原型上任意成员

属性查找、搜索原则

1. 首先在对象自身上查找是否有该属性,如果有,返回结果

 2,如果没有,就去对象的原型上进行查找, 如果有,返回结果

 3,如果没有,就沿着原型链继续往上查找,直到Object.prototype原型上即可,如果有,返回结果

4. 如果Object.prototype原型上也没有,返回undefined

下面看案例

公共的构造函数 Person :下面每一个实例都要使用这个函数

function Person(name, age) {
			this.name = name;
			this.age = age;
		}

		Person.prototype.name = "lw";
		Person.prototype.age = 20;
		Person.prototype.gender = 'male';
		Object.prototype.gender = "wuman";//注意:这是在object 的原型上添加的属性

实例1:属性的设置原则:

1. 如果对象没有该属性, 就会给对象添加该属性

2. 如果对象有该属性,就会修改对象原来的属性值

	// 实例1--------------------
		console.log(Person.name);// Person 对象名的意思
		var p = new Person()
		console.log(p.name) //undefined
		console.log(p.age) //undefind
		console.log(p.__proto__.name)//lw

实例2:给对象添加属性

        // 实例2 ---------------
		var p = new Person("dacong", 20);
		p.gender = "不详";// 这是给p对象添加gender属性
		// p对象有gender 属性,所有直接在自己本身找到了该属性
		console.log(p.gender);  // 不详
		p.name = "zs";
		 console.log(p);//构造函数person
		console.log(p.name);//zs

        //设置对象的属性, 并不会改变原型链上的属性
		console.log(Person.prototype.name);//老王
		console.log(Person.gender)//wuman  

实例3:如果本身找不到该属性就往原型链上找,直到找到object的原型。

        // 实例3------------------
		var p = new Person();
		console.log(p);
		console.log(p.gender);// male 自己没有这个属性,就往原型链上找 object中有该属性
		// p的原型链:
		// 	p ==> Person.prototype ==> Object.prototype ==> null;

实例4:

        // 实例4-----------------
		var p = new Person("dacong", 20);
		console.log(p.name); // dacong      
		console.log(p.age); // 20		
		console.log(p.gender); // male	//找到person原型上的
		console.log(p.sex); // undefined 
		// p的toString 方法来源于 Object.prototype,沿着原型链找到的结果
		console.log(p.toString()); // "[object Object]"

总结:

1. 查找对象的属性:沿着原型链进行查找(找的是否有该属性,不管属性值是什么)

2.设置对象的属性:有,修改,没有就添加(不会影响到原型链上的属性)

3. 下面是原型链上的三角关系:prototype 、__proto__ 、 constructor.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值