一直说要写公众号,但是总感觉每次没啥词,理解不够深,

困惑了好久,看了网上不少资料,还是决定写一篇自己复习用。(老年人记忆力太差)

学习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!!!!!!!!!!!!!!!!!!!!!!!!!!