编程中,面向对象的特点如下:抽象、封装、继承、多态。
一、JavaScript面向对象
在JavaScript中,任何物体都可以看作一个对象,对象里包含物体的属性、行为,那为什么我们要把物体当成一个对象使用,而不是把它的属性分散开来呢?是因为,对象可以有效的防止全局变量被反复定义和污染,并且会提高信息的安全性。
- 如何定义一个对象?
第一种:工厂模式。通过function返回一个字面量(字面量表示如何表达这个值)来定义对象。
需要注意的是,{},Ojbect.create(),new Object() 创建的普通 对象,不能被继承,因为js 是基于原型链继承的,它必须得通过类和构造函数的prototype才能继承,普通对象是没有prototype的,只有__proto__,用来指向它的原型对象的prototype。能被继承的只有函数对象,它有prototype。
类的本质就是函数。
function CreatePerson(){
var person = {
name: 'cxm',
age: 16,
sex:'women',
interests: ['program', 'zheng', 'wushu'],
getBaseInfo: function(){
return 'name is '+ this.name + '; age is '+this.age+'sex:'+this.sex+ 'and interests is: '+this.interests[0]
+ this.interests[1]+this.interests[2]
},
greeting:function(){
return 'Hi, '+ this.name
}
}
return person
}
let one = new CreatePerson();
//同样的 {}可以替换成 Object.create({}) 和 new Object()
注意:此时 one.proto === Object.prototype,因为CreatePerson中的return指向的是Object。
第二种:构造函数模式
注意只有propotype的属性才能被称为构造函数,箭头函数不能被作为一个构造函数,因为它没有原型,也没有绑定this。
function CreatePerson(name){
this.name = name
this.age = 12
this.desc = function(){
return 'name is '+this.name+'age is '+this.age
}
}
let two = new CreatePerson('lili')
第三种:原型模式
function CreatePerson(){}
CreatePerson.propotype.name = name
CreatePerson.propotype.age = 12
CreatePerson.propotype.desc = function(){
return 'name is '+this.name+'age is '+this.age
}
let three = new CreatePerson()
第四种:混合模式
function CreatePerson(name){
this.name = name
this.age = 12
}
CreatePerson.propotype = {
desc:function(){ return 'name is '+this.name+'age is '+this.age}
}
let four = new CreatePerson('jiaojiao')
第五种:动态原型模式
function CreatePerson(name){
this.name = name
this.age = 12
if(typeof this.desc 'function'){
this.desc = function(){
return 'name is '+this.name+'age is '+this.age
}
}
}
let fifth = new CreatePerson('minmin')
二、继承
参考:
https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object_prototypes
https://www.cnblogs.com/thonrt/p/5900510.html