快速搞懂『原型、原型链』https://www.bilibili.com/video/BV1ci4y157Ci
笔记:
对应名称:
prototype:原型
__proto__:原型链、原型的链接点
从属关系:
prototype -》函数的一个属性:本质是对象{}
__proto__-》对象Object的一个属性:本质也是对象{}
对象的__proto__保存着该对象的构造函数的prototype
function Test(){
this.a = 1;
//this.b = 222;
}
console.log(Test.prototype);
const test = new Test();
console.log(test.__proto__);
console.log(Test.prototype === test.__proto__);//ture
console.log(Test.prototype.__proto__ === Object.prototype)//true
console.log(Object.prototype.__proto__);//null
Test.prototype.b = 2;
Object.prototype.c = 3;
console.log(test.a);//1
console.log(test.b);//2
console.log(test.c);//3
/**
* test {
* a: 1,
* b: 222, ---> 存在b, 就不去原型链上找了
* __proto__: Test.prototype = {
* b: 2,
* __proto__: Object.prototype = {
* c: 3
* X __proto__
* }
* }
* }
*/
当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去该对象的构造函数的prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,一直找到Object内建对象为止(Object.prototype.__proto__为null)。这就是原型链的概念。而之所以prototype能一层层找下去,是被__proto__属性串联起来的:对象的__proto__保存着该对象的构造函数的prototype
关系:instance.constructor.prototype = instance.__proto__
特点:
JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。
当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,
就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。
function Func(){}
Func.prototype.name = "Sean";
Func.prototype.getInfo = function() {
return this.name;
}
var person = new Func();//现在可以参考var person = Object.create(oldObject);
console.log(person.getInfo());//它拥有了Func的属性和方法
//"Sean"
console.log(Func.prototype);
// Func { name="Sean", getInfo=function()}
prototype (显式原型)
__proto__ (隐式原型)
Student(类).prototype === student(实例).__proto__