原型与原型链
相干属性
prototype
__proto__
constructor
1.prototype
所有者:所有函数
都有此属性
指向:构造函数所创立实例对象的原型对象
能够了解为一个节点
,结构器实例化的对象能够在原型对象上继承属性与办法
function Student(name) { this.name = name}let std1 = new Student("张三")Student.prototype.getName = function () { console.log(this.name);}std1.getName()//张三
2.__proto__
所有者:所有对象
都有的属性
指向:该对象的原型对象
能够了解为一个指针
,指向该对象的原型对象
function Student() {}let std1 = new Student()Student.prototype == std1.__proto__
3.constructor
所有者:原型对象
指向:实例对象的构造函数
此属性实例对象能够继承
function Student() {}let std1 = new Student()std1.__proto__.constructor == Student //truestd1.constructor == Student //trueStudent.prototype.constructor == Student //true
4.原型链
由1、2能够晓得,实例化对象的__proto__指向构造函数的prototype,原型对象也有__proto__属性,指向一个原型对象
那么能够将由__proto__连贯
的原型对象看作一个原型链
因而能够取得以下关系图
- 原型对象是通过Object构造函数生成的
- 红色的线就是原型链
//学校的构造函数function School(name, age) { this.name = name this.age = age}School.prototype.getName = function () { console.log(this.name);}School.prototype.getAge = function () { console.log(this.age);}//实例化一个学校let sch1 = new School("理工", 100)//学生的构造函数function Student(name, age) { this.name = name this.age = age}//实例化一个学生let std1 = new Student("张三", 18)//扭转一个学生的原型指向std1.__proto__ = sch1std1.getName() //张三console.log(std1.hasOwnProperty("getName"));//falseconsole.log("getName" in std1);//true
- std1上并没有getName办法,hasOwnProperty返回false
- 应用in操作符能够看出getName在原型链上,是std1继承来的办法
- std1.__proto__ -> sch1.__proto__ -> School.prototype
5.Function与Object的特殊性
Fuction本人结构了本人
function Student() {}
- 在创立一个函数时相当于上面代码
let Student = new Function()
- 那么这个函数能够看做一个实例化的对象,也有__proto__属性,Function是构造函数
function Student() {}Student.__proto__ === Function.prototype //true
- Function是一个函数应该也有一个构造函数,并且这个构造函数就是它本身
Function.__proto__ === Function.prototype
Object是由Function结构而来
let obj = {}let obj = new Object()
- 字面量模式创立一个对象就相当于用new实例化一个Object
- Object就是一个构造函数,函数是不是应该是由new实例化的Function,Object是Function的实例化对象,则有__proto__属性
Object.__proto__ === Function.prototype //trueObject.__proto__ === Function.__proto__ //true
- 因为Function作为构造函数是由本身结构而来,Function的__proto__与prototype雷同
- Object作为构造函数是由Function结构而来,看成一个实例化的对象,那么Object的__proto__指向Function的prototype
- 最初能够失去Object.__proto__ === Fuction.__proto__
- 那么其余内置对象是不是也有同样的个性呢?
总结
了解原型与原型链,次要还是分清谁有什么属性
,也就是prototype、__proto__、constructor从属于谁,函数?对象?原型?它们别离又代表什么
第5点只是辅助了解,两头也在强调它是什么
性会有什么属性