JavaScript对象创建与对象的继承

创建对象

  1. Object 构造函数创建
    这种方式创建对象代码比较多,每创建一个对象都要写很多代码,一般不用
let personal = new Object()
personal.name = 'wangwu'
personal.age = 18
console.log(personal) //{name: "wangwu", age: 18}
  1. 字面量创建
    这种方式创建对象,比较简洁,开发时用比较多;
let personal = {
		name:'wangwu',
		age:18
	}
console.log(personal) //{name: "wangwu", age: 18}
  1. 工厂模式
    工厂模式也就是流水线生产了,虽然快,但是不能识别一类对象,都是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)

在这里插入图片描述

  1. 自定义构造函数创建
    可以识别一类对象,但是每创建一个对象就创建了一个函数,而且函数都是一样的;
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
  1. 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}
  1. 原型链+构造函数组合继承
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的背后发生了啥?

  1. 创建一个空对象
  2. 给对象设置 __proto__ ,值为构造函数的prototype的值,this.__proto__ = 构造函数.prototype
  3. 执行构造函数体,给对象添加属性或者方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值