想看原视频请去B站 技术蛋老师 视频学习,此日志仅作为个人学习笔记用。
原型对象理解
1. __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性
2. __proto__的完整名称叫[[protortpe]]
a对象为孙子级,String为父级,String原型为爷爷辈,Object原型为祖先辈();
var a = new String('abc');
var b = new Number(666);
var c = new Object();
下面代码请结合图片理解。Object原型没有原型,指向null。
console.log(a.__proto__ === String.prototype);
console.log(b.__proto__ === Number.prototype); //孙子级a和b对象的__proto__
//与 父级 String的prototype属性指向一致,同时指向爷爷辈String原型
console.log(a.__proto__.__proto__ === b.__proto__.__proto__ );
console.log(a.__proto__.__proto__ === c.__proto__); //孙子级a和b对象的祖先级指向一致,
//同时指向祖先辈Object原型。
console.log(c.__proto__.__proto__) //祖先辈Object原型没有父亲辈,指向null。
面试题 Javascript new 一个新对象的过程。
1.创建一个新对象son
2.新对象son会被执行__proto__连接向原型对象,son.__proto__ === Mother.prototype
3.新对象son和函数调用的this会绑定起来,mother函数体的this会指向son。
4.执行构造函数的代码
5.如果函数没有返回值,name就会自动返回这个新对象。
function Mother(lastName){ //创建一个名为Mother的函数,lastName为参数
this.lastName = lastName;
console.log(this.lastName);
}
var son = new Mother('磊'); //Mother函数new了一个新函数son,并传值为'磊'.
son(); //打印磊
原型链理解
代码请配合图片理解
function Supermarket(){}
Supermarket.prototype.product = '口罩'; //在Supermaket 的原型中找到了属性
function Shop(){}
Shop.prototype = new Supermarket();
//注释 person.__proto__.__proto__ = Shop.prototype = Supermarket.prototype
//注释 Shop没有属性,更改Shop的原型Supermarket 找。
var person = new Shop();
//注释 person.__proto__ = Shop.prototype person没有属性通过原型去Shop 找,
console.log(person);
面试题《instanceof和原型链》如何判断一个变量是数组类型,继承中判断实例是否属于他的父类
第一题,判断greeting 对象 是否为数组
var greeting = ['新年快乐', '恭喜发财', '身体健康'];
console.log(greeting instanceof Array); //使用instanceof 判断是否为数组
第二题,判断f对象里是否有a或者b方法
var F = function(){};
Object.prototype.a = function(){};
Function.prototype.b = function(){};
var f = new F();
f 是 F的实例,F是父母,f为小孩。f和F都没定义a或者b方法
通过__proto__隐式属性查找,用控制台输入f查找,object下只有a:f()方法
instanceof运算符与原型链的理解会在下一个文章中介绍。