如何形成原型链
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 的成员查找机制
- 当访问一个对象的属性和方法时,首先查找这个对象自身有没有该属性。
- 没有就查找 他的原型 (
__proto__
指向的prototype对象)。 - 在没有就查找 原型对象对象的原型 (Object的原型对象)
- 以此类推 一直找到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