【js原型和原型链】

js原型和原型链

参考文章链接: link

一、构造函数和原型对象中的this

指向实例对象

js 复制代码
    // 定义构造函数
    function Star(name,age){
        this.name = name;
        this.age = age;
        console.log(this,'我是构造函数的this')
    }
    // 公共的属性或方法
    Star.prototype.sing=function(){
        console.log('我是会唱歌的明星')
        console.log(this,'我是原型对象中的this')
    }
    // 创建实例对象
    const obj=new Star('周深',18)
    obj.sing()

二、原型对象的constructor属性

默认原型对象的的constructor属性是指向构造函数(找自己的爸爸)的,但是当原型对象需要定义多个公共的方法时,原型对象会重新以赋值的方式进行定义,此时的constructor属性需要自己手动添加

js 复制代码
    // 定义构造函数
    function Star(name,age){
        this.name = name;
        this.age = age;
    }
    // 公共的属性或方法
    // 定义多个方法
    Star.prototype={
        constructor: Star,
        sing:function(){
            console.log('我会唱歌')
        },
        dance:function(){
            console.log('我还会跳舞')
        }
    }
    
    // 创建实例对象
    const obj=new Star('单依纯',18)
    console.log(Star.prototype.constructor)

三、原型链

js 复制代码
    // 定义构造函数
    function Star(name,age){
        this.name = name;
        this.age = age;
    }
    // 公共的属性或方法
    // 定义多个方法
    Star.prototype={
        constructor: Star,
        sing:function(){
            console.log('我会唱歌')
        },
        dance:function(){
            console.log('我还会跳舞')
        }
    }
    
    // 通过构造函数创建实例对象
    const obj=new Star('单依纯',18)
    // 原型对象和实例对象找爸爸 构造函数
    console.log(Star.prototype.constructor===obj.constructor)
    // 构造函数找自己的大儿子 原型对象
    console.log(Star.prototype)
    // 实例对象找原型对象 二儿子去找大儿子玩
    console.log(obj.__proto__)
    // 判断是不是都在找大儿子
    console.log(Star.prototype===obj.__proto__)
    //  原型链 大儿子去找妈妈
    console.log(Star.prototype.__proto__)
    // 判断一下是不是顶点object.prototype
    console.log(Star.prototype.__proto__===Object.prototype)

四、关系图

五、普通函数和函数对象

所有Function的实例都是函数对象,其他的都是普通对象,Function实例的实例就是普通对象

所以回过头来我们会发现实例对象只是一个普通对象,obj是没有prototype属性的,而构造函数是一个函数对象,只有函数对象才有prototype这个原型属性

而prototype可以帮助我们定义或者重写一些新的公共方法

Object, Function, Array, String, Number, Boolean, Date 等都是 JS 内置的函数对象。

相关推荐
天下代码客6 小时前
使用electronc框架调用dll动态链接库流程和避坑
前端·javascript·vue.js·electron·node.js
冰暮流星7 小时前
javascript之数组
java·前端·javascript
xkxnq7 小时前
第五阶段:Vue3核心深度深挖(第74天)(Vue3计算属性进阶)
前端·javascript·vue.js
三小河7 小时前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
Hilaku7 小时前
不要在简历上写精通 Vue3?来自面试官的真实劝退
前端·javascript·vue.js
三小河8 小时前
前端视角详解 Agent Skill
前端·javascript·后端
颜酱8 小时前
二叉树遍历思维实战
javascript·后端·算法
鹏多多8 小时前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?
前端·javascript·react.js
不想秃头的程序员8 小时前
Vue3 封装 Axios 实战:从基础到生产级,新手也能秒上手
前端·javascript·面试
奔跑的web.8 小时前
UniApp 路由导航守
前端·javascript·uni-app