JS中原型对象、原型和原型链的理解

1.prototype属性(原型对象)

在ES6之前,对象不是基于类创建,而是使用构造函数。
每一个构造函数都有prototype属性,指向另一个对象,这个对象的所有属性和方法都会被构造函数所拥有。故对于实例化对象,可以利用构造函数的prototype属性实现方法的共享

举个栗子:

        function Person(name) {
            this.name = name
        }

        Person.prototype.sing = () => {
            console.log("singing...")
        }
        let p1 = new Person('小明')
        let p2 = new Person('小红')
        console.log(p1)
        console.log(p2)
        console.log(p1.sing === p2.sing)

执行结果:
在这里插入图片描述
可以看到实例化的两个对象都挂载了sing方法,且引用的sing方法是同一个。

对比一下,若是将sing方法写在构造函数中:

        function Person(name) {
            this.name = name
            this.sing = function() {
                console.log("singing...")
            }
        }

        let p1 = new Person('小明')
        let p2 = new Person('小红')
        console.log(p1)
        console.log(p2)
        console.log(p1.sing === p2.sing)

执行结果:
在这里插入图片描述
可以看到实例化的两个对象都挂载了sing方法,但引用的sing方法不是同一个。因此,若是共享的方法,应挂载在构造函数的prototype属性上,减少内存的浪费。

2.__proto__属性(对象原型)

每一个对象都会有一个__proto__属性,指向其构造函数的prototype原型对象。

        function Person() {}
        let p = new Person()
        console.log(p.__proto__ === Person.prototype)  // true

因为prototype也是对象,所以也有__proto__属性,指向其构造函数的prototype原型对象。

        function Person() {}
        console.log(Person.prototype.__proto__ === Object.prototype)  // true

3.constructor属性

原型对象和对象原型都有个默认属性constructor,默认指向构造函数。
原型对象prototype:

        function Person() {}
        console.log(Person.prototype.constructor === Person)  // true

前面提到了每一个构造函数都有prototype属性,而constructor属性在prototype对象上面,故其可以被所有实例对象继承。

        function Person() {}
        let p = new Person()
        console.log(p.constructor === Person)  // true
        console.log(p.constructor === Person.prototype.constructor)  // true

对象原型__proto__:

        function Person() {}
        let p = new Person()
        console.log(p.__proto__.constructor === Person)  // true

4.原型链

因每一个对象都有自己的原型__proto__,指向其构造函数的prototype原型对象,而原型本身也是对象,于是就形成了一个链式结构,叫做原型链
原型链:对象的原型=>原型的原型=>原型的原型的原型…
以上面的例子为例:p=>Person.prototype=>Object.prototype=>null
整合上面的关系,用图来表示如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值