原型链的解析

一,函数对象

            所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
            所有函数拥有prototype属性(显式原型)(仅限函数)
            原型对象:拥有prototype属性的对象,在定义函数时就被创建

二,原型和原型链

        Function.prototype.a = "a";
        Object.prototype.b = "b";
        function Person(){}
        console.log(Person);    //function Person()
        let p = new Person();
        console.log(p);         //Person {} 对象
        console.log(p.a);       //undefined
        console.log(p.b);       //b

p.a打印结果为undefined,p.b结果为b

解析:

p是Person()的实例,是一个Person对象,它拥有一个属性值__proto__,并且__proto__是一个对象,包含两个属性值constructor和__proto__

        console.log(p.__proto__.constructor);   //function Person(){}
        console.log(p.__proto__.__proto__);     //对象{},拥有很多属性值

我们会发现p.proto.constructor
返回的结果为构造函数本身
p.proto.proto
有很多参数 我们调用constructor属性
p._proto.proto.constructor
得到拥有多个参数的Object()函数,
Person.prototype的隐式原型的constructor指向Object(),
即Person.prototype.proto.constructor == Object()

从p.proto.constructor
返回的结果为构造函数本身得到
Person.prototype.constructor == Person()所以
p._proto.proto== Object.prototype

所以p.b打印结果为b,p没有b属性,会一直通过__proto__向上查找,最后当查找到Object.prototype时找到,最后打印出b,向上查找过程中,得到的是Object.prototype,而不是Function.prototype,找不到a属性,所以结果为undefined,这就是原型链,通过__proto__向上进行查找,最终到null结束

在这里插入图片描述

所以总的来说

对js原型和原型链的理解就是万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。那样太消耗内存了。所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。

在js中每个对象都有一个与它关联的对象,叫做原型对象。每一次获取对象属性都是一次查询过程,当在对象的自有属性中找不到时就会去查找它的原型对象。

在js中函数也是一个对象。每个函数都有一个prototype属性(只有函数才有prototype属性),这是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。其中原型对象会自动获得一个constructor属性,这个属性指向prototype属性所在的指针。

发布了23 篇原创文章 · 获赞 0 · 访问量 481

猜你喜欢

转载自blog.csdn.net/weixin_45806273/article/details/104313193
今日推荐