js构造函数的prototype赋值总结

我们知道通过构造函数的prototype,可以生成让所有实例对象访问的通用属性和方法,下面通过代码来解释这个过程

复制代码
function Person(name){
    this.name = name;
}

Person.prototype.sex = 'man'

我们定义了一个构造函数Person,然后给它的prototype添加了一个sex的属性,下面我们来看看Person的结构

复制代码
console.dir(Person)

下面,我们来实例化一个person的对象

复制代码
let person = new Person('mike')
console.dir(person)

上面的结构我们看的到person的原型_proto_(图片中的\[prototype],浏览器写法的区别)指向了构造函数Person的prototype

复制代码
person.__proto__ === Person.prototype // true

这里需要特别注意的一点是__proto__和prototype属性都是作为对象的一个引用,是指针,指向存储中实际存在的一个变量,当变量中的属性和方法有变化的时候__proto__和prototype都会随之改变

如果prototype指针指向新的变量的时候,prototype会有一个新的值,但是__proto__并不会改变哦,因为它的指针没有变换指向哈,还是指向原来的变量,值当然不会改变.

我们来看看是不是和我们判断一样

复制代码
function Person(name){
    this.name = name;
}
Person.prototype.sex = 'man'
let person = new Person('mike')
Person.prototype = { age: 18 }
person.__proto__
//{sex: 'man', constructor: ƒ}
Person.prototype
//{age: 18} 

从上述代码看出,和我们的预判一致,下面我们多创建一些实例对象来体验一下

复制代码
function Person(name){
    this.name = name;
}
Person.prototype.sex = 'man'
let person1 = new Person('mike')
Person.prototype = { age: 18 }
let person2 = new Person('lili')

下面,我们分别来看重新赋值前后,两次实例对象的区别

复制代码
person1.age // undefined
person2.age //18
person1.sex // 'man'
person2.sex //undefined

所以,我们可以总结出,

1、构造函数prototype修改或者添加属性会对原实例对象产生影响

2、构造函数prototype重新赋值,不会对原实例对象产生影响,只会对修改后的实例对象有影响

相关推荐
不是万能的豆学长1 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
懂点Tech5 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
catchadmin6 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路7 小时前
go-grpc设计思想
开发语言·后端·golang
酷炫码神7 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
Elastic 中国社区官方博客8 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1888 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn9 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
传奇开心果编程10 小时前
【Rust入门练中学】第5课:引用与借用
开发语言·rust·引用·编程语言理论·通用编程语言·借用
qetfw10 小时前
Bash 变量:export、位置参数与默认值展开验证
linux·开发语言·chrome·bash