js 原型链 成员查找机制

如何形成原型链

Object.prototype 所有对象的最终原型

function Per(){

}
console.log(Per.prototype);

Per.prototype.__proto__ = Object.prototype;

在这里插入图片描述
原型还有原型

function Ground(lastname){
	this.lastname = lastname;
}
Ground.prototype.name = 'Ground';
Ground.prototype.lastname = 'lastname';
var ground = new Ground('----lastname----')

function Father(){
	this.age = 18
}
Father.prototype = ground;
var father = new Father()

function Son(){
	this.sex = '--??--'
}
Son.prototype = father;
var son = new Son();

console.log(son.sex);      // '--??--'
console.log(son.age);  	   // 18
console.log(son.name);     // 'Ground'
console.log(son.lastname); // '----lastname----'
console.log(son.fooo);     // undefined

// 解析 
// 查找变量 又近到远 类似于作用域链
// son.sex 自身有 直接获取 停止查找
// son.age 自身没有 通过 son.__proto__:father 查找age 停止查找
// son.name 自身没有 通过 son.__proto__:father  查找 
//			father 没有 通过 father.__proto__:ground 查找 
// 			没有 通过 ground.__proto__:Ground.prototype 找到 停止查找      
// son.lastname 自身没有 通过 son.__proto__:father 查找 
//			father 没有 通过 father.__proto__:ground 查找 
// 			找到 停止查找   
// son.fooo 自身没有 通过 son.__proto__:father  查找 
//			father 没有 通过 father.__proto__:ground 查找 
//			ground 没有 通过 ground.__proto__:Ground.prototype 查找 
//          Ground.prototype 没有 通过 Ground.prototype.__proto__: Object.prototype查找
//          Object.prototype 没有 已经到了 所有对象的最终原型 没有
// 			undefined 停止查找  

在这里插入图片描述

js 的成员查找机制

  1. 当访问一个对象的属性和方法时,首先查找这个对象自身有没有该属性。
  2. 没有就查找 他的原型 ( __proto__指向的prototype对象)。
  3. 在没有就查找 原型对象对象的原型 (Object的原型对象)
  4. 以此类推 一直找到Obj为止(null)

原型链上的 增 删 改 查

和原型的 增删改查 类似
增删改查 找变量 又近到远 类似于作用域链
都只能重自身修改 ,不能有后代修改

//后代修改 ground 
son.lastname = 'ddd'; //修改不了原型链上的属性 只能修改自身的属性

特例 引用值修改

function Father(){
	this.name = "father"
	this.obj = {
		car1:'car1'
	}
	this.num = 0
}
var father = new Father();

function Son(){

}
Son.prototype = father;
var son = new Son();
son.__proto__.obj.car1 = 'xxx';

console.log(son.obj);//{car1:'xxx'}
son.num ++ // --> son.num = son.num(father的num) + 1
console.log(son.num);//1
console.log(father.num);//0


Object.create(原型)

指定你的原型

//var obj = Object.create(原型)
var oto = {
	name:"oto",age:"1231"
}
var obj = Object.create(oto);

console.log(obj.__proto__)

在这里插入图片描述

绝对多数对象 最终都会继承自Object.prototype

例外

var obj = Object.create(null)

没有 继承自Object.prototype
在这里插入图片描述
人为加的 __proto __ 系统不会读

var obj = Object.create(null)
obj.__proto__ = {name:"fff"};

console.log(obj.name);//undefined
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值