【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 内置的函数对象。

相关推荐
anOnion7 小时前
Agentic 前端开发之 实时显示 AI Agent 终端输出
前端·javascript·人工智能
这是个栗子7 小时前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
fei_sun8 小时前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
摇滚侠9 小时前
方法 A 等方法 B 执行完再执行 叫同步调用还是异步调用 JS 默认是同步调用还是异步调用
开发语言·javascript·ecmascript
触底反弹10 小时前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
触底反弹10 小时前
AI Tool Use 深度解析:大模型是如何"突破物理限制"调用外部工具的?
javascript·人工智能·后端
竹林81810 小时前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript
优雅格子衫11 小时前
TypeScript 类的基本使用小结
javascript·ubuntu·typescript
橘子星11 小时前
从零手写 RAG 语义检索:基于 Node.js 实现轻量级向量搜索
javascript·人工智能
林希_Rachel_傻希希11 小时前
web性能优化之————图片效果
前端·javascript·面试