1.什么是原型链?
每个构造函数都有原型对象;每个对象都会有构造函数;每个构造函数的原型都是一个对象;那么这个原型对象也会有构造函数;那么这个原型对象的构造函数也会有原型对象;这样就会形成一个链式的结构,称为原型链。
2.原型链结构的基本形式
function Person(name){ this.name = name; } var p = new Person(); //p ---> Person.prototype --->Object.prototype---->null
3.属性搜索原则:
a.当访问一个对象的成员的时候,会现在自身找有没有,如果找到直接使用,
b.如果没有找到,则去当前对象的原型对象中去查找,如果找到了直接使用,
c.如果没有找到,继续找原型对象的原型对象,如果找到了,直接使用
d.如果没有找到,则继续向上查找,直到Object.prototype,如果还是没有,就报错
4.原型继承概念
通过修改原型链结构实现的继承,就叫做原型继承。
5.复杂的原型链
//动物--->人---->老师---->坏老师 function Animal(){ this.gender = "male"; } Human.prototype = new Animal(); Human.prototype.constructor = Human; function Human(){ this.actionWay = "走路"; } Teacher.prototype = new Human(); Teacher.prototype.constructor = Teacher; function Teacher(){ this.skill = "教书"; } BadTeacher.prototype = new Teacher(); BadTeacher.prototype.constructor = BadTeacher; function BadTeacher(){ this.name = "吕超"; } var t = new BadTeacher(); console.log(t);
6.Object.prototype的成员
①.constructor:
原型对象内的一个属性,指向该原型对象相关联的构造函数。
②.hasOwnProperty:
一个方法,用来判断对象本身(不包含原型)是否拥有某个属性。
function Person(){ this.name = "王九" } Person.prototype.name = "张三"; var p = new Person(); console.log(p.name); console.log(p.hasOwnProperty("__proto__"));
③.propertyIsEnumerable:
a. 判断属性是否属于对象本身
b. 判断属性是否可以被遍历
console.log(p.propertyIsEnumerable("name"));
④.将对象转换成字符串
var o = {}; console.log(o.toString()); console.log(o.toLocaleString()); var now = new Date(); console.log(now.toString()); console.log(now.toLocaleString());
⑤.valueOf:
获取当前对象的值
function Person(){ } var p = new Person(); //在对象参与运算的时候 //1.默认的会先去调用对象的valueOf方法, //2.如果valueOf获取到的值,无法进行运算 ,就去去调用p的toString方法 最终做的就是字符串拼接的工作 console.log( 1 + p);
⑥ _proto_:
a.原型对象对象中的属性
b.可以使用 对象._proto_去访问原型对象
作者:费莱姆
链接:https://www.jianshu.com/p/a52748eb573a