原型链__proto__
__proto__也就是对象的 [[prototype]]属性
每一个函数都有一个属性叫做prototype,指向一个对象(不是函数就没有这个属性)这个对象叫原型对象,当这个构造函数被new的时候,他的每一个实例对象的__proto__属性,也指向这个原型对象,用时这个原型对象也可以通过constructor,来访问构造函数。__proto__是神器,有原链查找功能,当new出来的对象本身没有这个属性的时候,系统会沿着__proto__去寻找他的原型身上没有的这个属性,所谓的原型链就是__proto__的链条,只有chrome中这个属性可以使用,其他内核中有这个但不可以使用,
console.log(People.prototype === xiaomio.__proto__); //true
function People2(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
People2.prototype = { //每一个构造函数都有一个属性叫做prototype,指向一个对象。
"teacher": "考拉",
"zhishang" : 180,
"gongzi": 30000
}
var xiaomio2 = new People2("小明", 19, "男");
console.log(xiaomio2.teacher);
//考拉
// (当这个函数被new的时候,他的每一个实例的__proto__属性,也指向这个对象,所以当原来的对象没有这个属性的时候系统会沿着__proto__去寻找他的原型身上没有的这个属性)
同一个构造函数new出来的实例共享同一个prototype
var xiaomio2 = new People2("小明",19,"男");
var xiaoho2 = new People2("小红",12,"女");
console.log(xiaoho2.teacher === xiaomio2.teacher); //true
使用原型来继承一些其他的方法
function People3(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
People3.prototype = Math;
var xiaomio3 = new People3("小明", 19, "男");
console.log(xiaomio3.random()); //0.30685614374013936
解析:当People3的prototype指向了Math的属性的时候,那么people3 new出来的对象也可以通过__proto__来获得Math的属性
function People4(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
People4.prototype = {
sayHello: function () {
alert("你好我是" + this.name + "我的年纪为" + this.age + "我的性别是" + this.sex);
}
}
var xiaomio4 = new People4("小明", 19, "男");
var xiaoho4 = new People4("小红", 12, "女");
console.log(xiaoho4.sayHello === xiaomio4.sayHello); //true
图像的理解
指向相同的对象堆内地址也相同所以为true
补充:prototype,__protp__,constructor的指向
Function.prototype === Function.__proto__
Function.__proto__ === Function.prototype,很简单的,函数是Function的实例,每一个实例内部都有一个属性__proto__指向该构造函数的prototype,恰巧Function本身就一个函数 function Function() {}
下面的图是我自己整理的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)