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

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

看下面的代码


<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



相关文章
|
7天前
|
搜索推荐
如何在构造函数中为类的实例添加方法?
在实际开发中,要根据具体的场景和需求来选择合适的方式来为类的实例添加方法,以确保代码的可读性、可维护性和性能。
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
52 4
|
27天前
|
设计模式 JavaScript 前端开发
原型链和类之间的区别和联系是什么
【10月更文挑战第22天】原型链和类之间的区别和联系是什么
29 0
|
27天前
|
设计模式 JavaScript 前端开发
原型链和类之间的区别在哪里
【10月更文挑战第22天】原型链和类之间的区别在哪里
14 0
|
3月前
|
JavaScript 前端开发 Java
原型对象和类之间的区别是什么
【8月更文挑战第2天】原型对象和类之间的区别是什么
77 8
|
6月前
|
存储 C++
c++类和对象一对象特性一成员变量和成员函数分开存储
c++类和对象一对象特性一成员变量和成员函数分开存储
43 0
|
编译器 C语言 C++
C++ 之什么是类 & 对象的关系?
C++ 之什么是类 & 对象的关系?
|
算法 Java 编译器
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
|
设计模式
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
下一篇
无影云桌面