JavaScript是一种面向对象的语言
面向过程是按照步骤一个个调用函数,实现某一件事情。
面向对象是把事件分为一个个对象对象之间合作分工完成一键事情。
面向对象的特性是
1.封装
2.继承
3.多态
举个例子
一个人就是一个对象,每个对象都有一个名字,年龄,身份证号码,我们把这些内容都保存起来做成身份证,就是Person类(人类)封装,
父亲有身份证,儿子也要有身份证,就是继承,儿子(子函数)可以有父亲(父函数)的方法和属性,
同样是人,有的人会跳舞,有的人会打王者荣耀,就是多态
对象实例化时可以每个人都创建一个对象
var fu = { age:"23", gender:"man" } var wang = { age:"26", gender:"man" }
写好了,但是我们不禁想起,每个对象之间似乎没有任何联系,而且100人要写100次
于是我们创建一个函数,
function Person(age,gender){ return{ age:age, gender:gender, } } fu = Person("19","man") console.log(fu.gender);
每次我们要创建实例的时候只需要调用一次函数就可以了
但是问题又来了,这样写似乎不太行如果我们要修改age,想让age等于10年后的自己怎么办呢
于是我们修改函数
function Person(age,gender){ obj = {} obj.age = age obj.gender = gender return obj } fu = Person("19","man") console.log(fu.age);
解决问题,完美收工,唉!每次想获取属性还需要return一下非常不方便,于是我们再次更改,使用构造函数模式
function Person(age,gender){ this.age = age; this.gender = gender } fu = new Person("23","man") console.log(fu.age);
我们使用this替代object传参模式,这样不用return参数就能获得创建的实例fu的所有属性
注:
1.创建实例的时候必须要new一下
2.在实例化之前的this是指向window 在实例化之后的this是指向构造函数
3.构造函数写法是首字母大写(想咋写咋写嘛看得懂就行)
父亲有一块玉佩,儿子想用可以使用,这就是原型链,如果追溯到这块玉佩的使用权,那么就是父亲,大儿子要用这块玉佩,二儿子也要用这块玉佩,他们使用的是同一块那么就不需要一遍遍的重新定义
我们就可以把他定义在prototype上面,既实例化函数原型
function Person(age,gender){ this.age = age; this.gender = gender } Person.prototype.something = "玉佩" fu = new Person("23","man") console.log(fu.something);
父亲想要用这块玉佩需要调用
在函数中的解释就是改变this的指向,劫持别人的this
那么call 和 apply 有什么区别呢
其实就是传参的方式
Person.call(obj,age,gender) 传参方式为第一个对象(劫匪) 第二个为参数 第三个第四个为参数
person.apply(obj,[age,gender]) 传参方式为第一个对象(劫匪) 第二个为含参数组
PS:本博客为记录学习时使用 不代表任何立场
如有问题欢迎各位大佬指出
QQ:1759435876 微信、邮箱同号
原文:https://www.cnblogs.com/fuyi2345/p/15116133.html