创建对象
- Object 构造函数创建
这种方式创建对象代码比较多,每创建一个对象都要写很多代码,一般不用
let personal = new Object()
personal.name = 'wangwu'
personal.age = 18
console.log(personal) //{name: "wangwu", age: 18}
- 字面量创建
这种方式创建对象,比较简洁,开发时用比较多;
let personal = {
name:'wangwu',
age:18
}
console.log(personal) //{name: "wangwu", age: 18}
- 工厂模式
工厂模式也就是流水线生产了,虽然快,但是不能识别一类对象,都是object
function createPersonal(name,age){
let obj = new Object()
obj.name = name
obj.age = age
return obj
}
function createDog(name,age){
let obj = new Object()
obj.name = name
obj.age = age
return obj
}
let personal = createPersonal('wangwu',18)
let dog = createDog('tom',2)
console.log(personal)
console.log(dog)
- 自定义构造函数创建
可以识别一类对象,但是每创建一个对象就创建了一个函数,而且函数都是一样的;
function Personal(name,age){
this.name = name
this.age = age
this.sayName = function(){
console.log(this.name)
}
}
function Dog(name,age){
this.name = name
this.age = age
this.sayName = function(){
console.log(this.name)
}
}
let p = new Personal('wangwu',18)
let d = new Dog('tom',2)
console.log(p)
console.log(d)
5. 自定义构造函数 +原型组合模式
这样方法都在原型中,不用每次创建,very good
function Personal(name,age){
this.name = name
this.age = age
}
Personal.prototype.sayName = function(){
console.log(this.name)
}
let p = new Personal('wangwu',18)
console.log(p)
p.sayName()
对象的继承
1.原型链继承
function Personal(){
this.name = 'personal one'
}
Personal.prototype.sayName = function(){
console.log(this.name)
}
function Student(){
this.name = 'student one'
}
Student.prototype = new Personal() //子类的原型指向父类的实例
//此时 Student.prototype__proto__ == Personal.prototype //true
//所以Student.prototype是Personal的一个实例,
//Student.prototype.constructor == Personal //true
//所以下面是更正Student.prototype.constructor的错误指向
Student.prototype.constructor = Student
let stu1 = new Student()
stu1.sayName() //可以输出 student one
- call 继承 (假继承)
function Personal(name,age){
this.name = name
this.age = age
}
Personal.prototype.sayName = function(){
console.log(this.name)
}
function Student(name,age,score){
Personal.call(this,name,age)//更改构造函数的this指向
this.score = score
}
let stu1 = new Student('wangwu',18,78)
console.log(stu1) //Student {name: "wangwu", age: 18, score: 78}
- 原型链+构造函数组合继承
function Personal(name,age){
this.name = name
this.age = age
}
Personal.prototype.sayName = function(){
console.log(this.name)
}
function Student(name,age,score){
Personal.call(this,name,age)//更改构造函数的this指向
this.score = score
}
Student.prototype = new Personal() //子类的原型指向父类的实例
Student.prototype.constructor = Student
let stu1 = new Student('wangwu',18,78)
console.log(stu1) //Student {name: "wangwu", age: 18, score: 78}
stu1.sayName() //可以输出 wangwu
new的背后发生了啥?
- 创建一个空对象
- 给对象设置
__proto__
,值为构造函数的prototype的值,this.__proto__ = 构造函数.prototype
- 执行构造函数体,给对象添加属性或者方法