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

相关推荐
元直数字电路验证3 分钟前
ASP.NET Core Web APP(MVC)开发中无法全局配置 NuGet 包,该怎么解?
前端·javascript·ui·docker·asp.net·.net
我有一棵树42 分钟前
Vue 项目中全局样式的正确写法:不要把字体和主题写在 #app 上
前端·javascript·vue.js
龙仔CLL1 小时前
微前端乾坤vue3项目使用tinymce,通过npm,yarn,pnpm包安装成功,但是引用报错无法使用
javascript·arcgis·npm
Mountain083 小时前
解决 Node.js 启动报错:digital envelope routines 错误全记录
javascript·npm·node.js
wangbing11254 小时前
开发指南139-VUE里的高级糖块
前端·javascript·vue.js
半桶水专家4 小时前
Vue 3 动态组件详解
前端·javascript·vue.js
我有一棵树4 小时前
避免 JS 报错阻塞 Vue 组件渲染:以 window.jsbridge 和 el-tooltip 为例
前端·javascript·vue.js
没有鸡汤吃不下饭5 小时前
解决前端项目中大数据复杂列表场景的完美方案
前端·javascript·vue.js
Tzarevich5 小时前
现代JavaScript字符串处理:从基础语法到模板字符串的深度演进与技术实践
javascript
低保和光头哪个先来6 小时前
如何实现弹窗的 双击关闭 & 拖动 & 图层优先级
前端·javascript·css·vue.js