js的面对对象
js是一个基于对象的语言,在es6之前,js是使用了构造函数来模拟类,使得js也可以面对对象来编程,es6中加入了类的定义
创建对象的方式
通过字面量的方式创建
let obj={
name:"小明",
age:12
}
//实例化对象创建对象
let person = new Object()
person.name ="小明"
person.age ="12"
工厂模式创建对象
function createObject(name,age){
let person = new Object()
person.name = name
person.age = age
person.eat = function(){
console.log("吃饭")
}
}
构造函数方式创建
function Person(name,age){
this.name = name
this.age = age
this.eat =function(){
console.log("吃面")
}
}
检查对象中是否有该属性
1.in name in person
2.hasOwnProperty方法person.hasOwnProperty("name")
区别:in检查对象中是否有该属性,特点是通过继承的属性他也会检查到是属于当前对象的
hasOwnProperty通过继承的属性返回false,自身拥有的属性才返回true
删除属性delete
delete person.name
继承
实现继承的目的:
实现数据共享,节省内存空间
当我们通过一个类创建了50个对象,然后我们如何给它添加新方法呢,给构造函数的原型对象prototype添加方法即可,那这50个对象都会拥有这个方法
子类如何继承父类
1.使用apply方法和call方法
//父类
functon Human(name){
this.name = name
}
//子类
function Man(name,job){
//实现继承
Human.call(this,name) //call(this,参数)
//Human.apply(this,数组)
this.job = job
}
2.使用prototype
//父类
function Human(name){
this.name = name
}
Human.prototype.work=function(){
console.log("eat")
}
//子类
function Man(name,job){
this.name =name
this.job = job
}
Man.prototype = Human.prototype
let man= new Man("小白","老师")
man.work() //eat
js中实现继承是靠prototype这个属性,构造函数都有一个原型对象prototype,原型对象中有一个构造器constructor它指向了构造函数,通过这个构造函数实例化的对象中都有一个proto属性它指向了原型对象
es6定义类的方式
es6实现继承:Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。
class Person{ //定义类
constructor(name,age){
this.name = name
this.age =age
}
eat(){
console.log(this.name+"吃饭")
}
play(){
console.log(this.name+"打篮球")
}
}
//继承extends
class Man extends Person {
constructor(name,age,job){
super(name,age) //继承父类的属性
this.job = job
}
eat(){
super.eat() //调用父类方法
}
}
let a = new Man("小米",10,"laos")
a.eat()