1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 面向对象2(构造函数 实例对象 原型对象——关系理解)

面向对象2(构造函数 实例对象 原型对象——关系理解)

时间:2023-02-20 20:16:54

相关推荐

面向对象2(构造函数 实例对象 原型对象——关系理解)

参考解释:

对象原型

构造函数与实例对象

构造函数与实例对象

关系:

实例对象是通过构造函数来创建的,创建的过程叫实例化。

示例代码:

//1.自定义构造函数function Person(name,age){// 当使用 new 操作符调用 Person() 的时候,实际上这里会先创建一个对象// var instance = {}// 然后让内部的 this 指向 instance 对象// this = instance// 接下来所有针对 this 的操作实际上操作的就是 instancethis.name=namethis.age=agethis.play=function(){console.log('play games')console.log(this.name)}// 在函数的结尾处会将 this 返回,也就是 instance// return this}

//2.创建对象let per = new Person('小白',10)per.play()

console.dir(per)//输出实例对象//Personconsole.dir(Person)//输出构造函数//ƒ Person(name,age)console.log(per.constructor)//per这个实例对象的构造器(构造函数)/**ƒ Person(name,age){* this.name=name* this.age=age* this.play=function(){* console.log('play games')* }*}*/

//判断对象具体类型的两种方法console.log(per.constructor===Person)//trueconsole.log(per instanceof Person)//true//一个实例对象的构造器不一定是自己的构造器,有可能是Object;因此推荐第二种方法

(1)1到2的过程就叫实例化对象的过程,即对象实例化

(2)per这个对象的构造函数就是Person

原型对象

__proto__与prototype

console.log(per.__proto__.constructor===Person)//trueconsole.log(per.__proto__.constructor===Person.prototype.constructor)//true

关于构造函数内存浪费的问题,通过原型添加方法解决,实现数据共享

function Person(name,age){this.name=namethis.age=agethis.play=function(){console.log('play games')}this.say=function(){console.log('hi')}}let per1=new Person('小白',10)let per2=new Person('小黄',8)per1.play()per2.play()console.log(per1.play === per2.play) //false 指向不同的空间,其中的内容一样,内存浪费//原型添加方法解决数据共享function Person(name,age){this.name=namethis.age=age}Person.prototype.play=function(){console.log('play games')}Person.prototype.say=function(){console.log('hi')}//==可写成==function Person(name,age){this.name=namethis.age=age}Person.prototype={

constructor:Student,play:function(){console.log('play games')},say:function(){console.log('hi')}}let per1=new Person('小白',10)let per2=new Person('小黄',8)per1.play()per2.play()console.log(per1.play === per2.play) //true 指向同一空间,内存节省

对原型对象的理解:

实例对象中,有__proto__属性,也是对象,称为原型,不是标准的属性,浏览器使用,IE8不支持

构造函数中,有prototype属性,也是对象,称为原型,是标准属性,程序员使用

__proto__和prototype都是原型对象

原型作用之一:实现数据共享,节省空间

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

解释理解:

构造函数有prototype属性(先这么理解),即为原型对象;

原型对象中的constructor构造器就是构造函数本身;

构造函数创建实例对象;

实例对象中有__proto__属性(先这么理解);

__proto__共用构造函数prototype中的方法

代码示例

总结

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

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

3.构造函数的原型对象(prototype)中有一个cunstructor构造器,这个构造器指向的就是自己所在的原型对象所在的构造函数

4.实例对象的原型对象(__proto__)指向的是该构造函数的原型对象,prototype中的方法共享给实例对象

5.原型对象中的添加的方法可以相互调用

6.实例对象使用的属性或方法,先在实例中查找,找到了则直接使用,找不到则去实例对象的__proto__指向的原型对象prototype中找,找到则使用,找不到则报错。示例代码:

补充:

原型指向可以改变

function Per (age){this.age=age }Per.prototype.say=function(){console.log('say111') }function Stu(){}Stu.prototype.eat=function(){console.log('eat111') }Stu.prototype = new Per(10)let stu = new Stu()stu.say()//say111

理解:

实例对象的原型__proto__指向的是该对象所在的构造函数的原型对象prototype;

构造函数的原型的指向改变了,实例对象的原型的指向也会跟着构造函数的原型的指向发生改变(人家是一条链上的);

实例对象和原型对象是通过__proto__联系起来的。

待补充待补充待补充......

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。