构造函数和实例对象和原型之间的关系

简介: 构造函数和实例对象和原型之间的关系

看下面的代码


<script>
    function Person(sex,age){
        this.sex=sex;
        this.age=age;
    }
    //   通过原型添加方法
    Person.prototype.sayHi=function(){
        console.log('你好呀')
    }
    var per=new Person('男','20')
    // 查看实例对象 我们发现:实例对象中有两个属性,age: "20"sex: "男"
    // 这两个属性是通过构造函数来获取的。即__proto__
    console.dir(per)
    // 构造函数名称
    //构造函数并没有sex和age这两个属性
    console.dir(Person)
</script>


我们发现的现象


实例对象中有两个属性,age: "20"sex: "男"


这两个属性是通过构造函数来获取的。即__proto__


但是构造函数并没有sex和age这两个属性


我们知道:实例对象中有一个属性,即__proto__;


它也是对象,叫做原型。


但是它不是标准的原型,是浏览器使用的。


构造函数中有个属性,叫做prototype,它也是对象,叫做原型。


是标准的属性,是程序员使用的。


也就是说 __proto__或者说prototype都是原型对象


所以我们可以大胆的猜测:


console.log(per.__proto__==Person.prototype)


输出的是true


充分证明了我们说的 __proto__或者说prototype都是原型对象。


只是一个是浏览器使用一个是程序员使用


刚刚分析的是正确的哈


那么他们的构造器呢


console.log(per.__proto__.constructor==Person.prototype.constructor)


同样返回来的是true


构造函数和实例对象和原型之间的关系


var arr=new Array(10,20,30)
arr.join('40')
console.dir(arr);

 

同样的,我们在__proto__和prototype下都可以找到join方法


__proto__是浏览器使用的原型,prototype 我们程序员使用的原型


他们三者之间的关系是


1. 构造函数创建了实例实例对象


2. prototype这个属性指向的就是这个原型对象


3. constructor这个构造器指向自己构造函数


4. 实例对象本身没有eat方法,但是他有__proto__这个属性可以调用eat方法


  原型对象中的方法可以被实例对象共享。[eat方法可以被共享]


5.构造函数创建了实例对象,有了构造函数也就有了原型对象


上面这几句话等价于下面的


1.构造函数可以实例化对象


2.构造函数中有一个属性叫做prototype,是构造函数的原型对象。


3.构造函数的原型对象{prototype}中有一个constructor构造器,


 这个构造器是指向自己所在的原型对象所在的构造函数。


4.构造函数的原型对象prototype中的方法可以被实例对象直接访问的。


5.实例对象的原型的对象(__proto__)指向的是该构造函数的原型对象。


1425695-20211128221003467-1421255243.jpg



相关文章
|
消息中间件 Java Maven
如何在Java中使用RabbitMQ
如何在Java中使用RabbitMQ
|
Linux 开发工具
【Linux】vim中批量化注释
【Linux】vim中批量化注释
202 0
【Linux】vim中批量化注释
|
消息中间件 存储 监控
【ZeroMQ的SUB视角】深入探讨订阅者模式、C++编程实践与底层机制
【ZeroMQ的SUB视角】深入探讨订阅者模式、C++编程实践与底层机制
1450 1
|
设计模式 安全 编译器
C++中精简艺术:省略参数名以提升代码清晰度
C++中精简艺术:省略参数名以提升代码清晰度
186 2
|
安全 JavaScript 前端开发
配置CORS跨域
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
|
算法 Linux 调度
【操作系统--CPU调度算法】Linux环境中C语言详解(附代码)
操作系统之CPU调度算法,使用C语言实现,可运行在linux环境中
630 0
|
存储 安全 Java
说说类加载的过程
说说类加载的过程
148 0
|
弹性计算 安全 Devops
云效Devops全家桶评测征集令获奖名单来啦!
云效Devops全家桶评测征集令获奖名单
云效Devops全家桶评测征集令获奖名单来啦!
如何解决代码在IE6下的双倍边距问题?底层原理是什么?
如何解决代码在IE6下的双倍边距问题?底层原理是什么?
224 0
Java 最常见的面试题:java 中的 Math.round(-1.5) 等于多少
Java 最常见的面试题:java 中的 Math.round(-1.5) 等于多少