一直说要写公众号,但是总感觉每次没啥词,理解不够深,
困惑了好久,看了网上不少资料,还是决定写一篇自己复习用。(老年人记忆力太差)
学习js这门语言的时候,最常听的一句话应该就是万物皆对象,如果问你有没有对象?
你说没有的话,很有可能会让你New一个,那么new对象到底是咋回事呢,这得从盘古
开天辟地说起了;
今天要讲的是面向对象 简称(OOP),(object oriented Programmin )
也是一门面向对象程序设计语言,然后面向对象大多数编程语言都有,因为
只会javascript,所以写的都是关于JavaScript的面向对象。
因为万物皆对象,我们的面向对象就是通过将现实事物以及关系通过程序抽象出来,
将同一类型事物放在对象里,形成了一种模型化。这个模型像一个盒子,在里面
可以存放着该对象的功能和属性,需要什么功能直接使用就行了。并且通过封装,继承,
多态等特性,事我们的程序更加灵活并且易于维护。
javascript没有类的概念只有对象,首先是封装对象。
js中创建对象可以直接对我们的属性和方法进行封装,便于大量数据的管理和使用。
创建对象有三种方式:
第一种是以字面量的形式,属性数据以可见的方式集中保存在一个{}里如:
var dudu={dname:"dudu"},
第二种是内置构造函数的方法,通过js自带的内置构造对象object,使用new的方式创建。
var dudu=new Object()
属性通过dudu["属性名"]的方式添加进去。
第三种是自定义构造函数,(也可以算两种,因为同是构造函创建),由自己定义事物类型。
如下:
function Dudu( name){
this.name:name
say=function(){
console.log(`i m ${this.name}`)}
}
var dede=new Dudu("dudu")
通过构造函数是js面向对象的根本。
上面这段代码在我们创建的时候会保存我们需要定义事物的类型,
当调用new操作符的时候做四件事
1会通过当前构造函数创建实例对象,
2并且将构造函数里的this指向当前的实例对象,
3(解释器自动)将内部的prototype属性给了实例对象的__proto__属性.
4返回新创建的对象,
js中任何函数都可以作为构造函数,函数可以将内部的属性进行很好的封装,有着良好的重用性,
但是通过构造函数创建的对象,有着相同的方法,重复的方法如果重复创建的话,第一个很耗内存,
第二个,可以但是没必要。(皮一下很快乐)
这就轮到了我们的prototype出手了,我们的js为每个函数都设计了一个prototype的属性。
当我们每创建一个构造函数的时候,我们的函数拥有一个内部属性prototype,该属性自带一个指针,
指向我们的原型对象,而原型对象也有一个内部属性consturctor,该属性也有一个指针指向我们其关联的构造函数。
当我们通过构造函数创建实例对象的时候,每个实例对象都带一个指针指向我们其创建构造函数的prototype属性,
所以构造函数里的prototype属性值,对其创建的实例对象来说是共享的。
当我们多个相同的实例对象需要共同的属性或者属性值时,就将需要的属性对应在我们构造函数的原型对象里,
function Dudu( name){
this.name:name;
}
Dudu.prototype.say=function(){
console.log(`i m ${this.name}`)
}
var dede=new Dudu("dudu")
通过上面的方式实例对象自动获得了构造函数的原型属性。
值得一提的是原型链:
当我们多个原型对象逐级继承的时候就形成了原型链
我们js里的每个对象都有一个原型对象__proto__ 该属性指向我们其构造函数的
prototype属性,也就是说__proto__属性可以像上一级级的查找父级元素的原型对象里的值
js中默认顶层原型对象是object 他的__proto__指向就是null了,所以当我们的子级对象需要什么属性,
或者需要什么值,自己没有的话可以沿着这条原型链一直查找,一直找到最顶层父对象
dede.__proto__=>Dudu.prototype
Dudu.prototype.__proto__=>function.prototype
function.prototype.__proto__=>object.prototype
object.prototype.__proto__=>null (好像是这样,忘记了)
差不多就这么多
多态是根据原型的根本来操作得,当我们原型对象得方法不是自己想要得时候,
我们可以设置同名得方法,这个感觉没啥意思 就是写个同名得方法,
原型链得顺序是先用自己得在去原型查找,不喜欢自己就写一个自己想要得
ok!!!!!!!!!!!!!!!!!!!!!!!!!!
浙公网安备 33010602011771号