1.字面量语法
直接定义一个对象
const person = {
name: '小明',
age:'12',
sayHello: ()=>{
alert('你好:'+this.name)
}
}
console.log('name',person.name);
person.sayHello();
优点:简单直白 缺点:创建相似对象时会有很多重复的代码
2.工厂模式,抽离了创建对象的过程。由于js无法创建类,所以就顶一个函数来封装创建对象的过程。
function person(name,age,sex) {
let obj={};
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.sayHello=()=>{
alert('hello '+obj.name);
}
return obj;
}
let person1 = person('xiao ming','12','女');
// 可以如此访问person1对象的值
console.log('name',person1.name);
// 调用sayHello方法
person1.sayHello();
优点:解决了创建相似对象代码复用的问题 缺点:无法知道这个对象的类型是什么
3.构造函数的方式
function Person(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sayHello=()=>{
alert('hello '+this.name);
}
}
// 通过new来生成Person的实例
let person1 = new Person('xiao ming','12','女');
// 可以如此访问person1对象的值
console.log('name',person1.name);
// 调用sayHello方法
person1.sayHello();
使用构造函数的方式创建对象比较灵活,在函数体内定义属性,在propotype属性上定义方法,是扩展性最好的创建对象的方式,例如:
Person.prototype.like='music';
Person.prototype.sayBye=()=>{
alert('bye');
}
person1.sayBye();
在使用new构造一个实例化对象的时候,每个对象会包含一个__proto__属性指向构造函数的原型对象,而原型对象中包含一个constructor属性指向构造函数,因此在实例对象中我们就可以通过原型链的方式访问到constructor属性对应的构造函数,从而判断对象的类型,例如:person1.constructor是Person函数
4.Object构造函数
1.通过以下方法创建一个空对象
let person = new Object();
然后向这个空对象中添加属性和方法
person.name = '小明';
person.age='12';
person.sayHello=()=>{
alert('hello '+person.name);
};
// 访问person对象的值
console.log('name',person.name);
// 调用sayHello方法
person.sayHello();
2.也可以直接把参数传递给Object()的构造函数创建对象
let person = new Object({
name: '小明',
age: '12',
sayHello:()=>{
alert('hello '+this.name);
}
});
// 访问person对象的值
console.log('name',person.name);
// 调用sayHello方法
person.sayHello();
5.create()方法
JS有一个内嵌的create()方法,是从指定的原型对象创建新对象,假设已经存在了一个person1对象,那么我们以person1为原型创建person2对象
// 假设本来就存在person1
let person1={
name: '小明',
age: '12',
sayHello:()=>{
alert('hello '+this.name);
}
}
// 使用create方法创建person2对象
let person2 = Object.create(person1);
console.log('name',person2.name);
person2.sayHello();
console.log('person2.__proto__',person2.__proto__);// 返回的对象是person1
6.原型模式
function Person() {}
Person.prototype.name='123';
Person.prototype.sayHello=function() {
console.log('hello')
}
这种方式定于属性不灵活,属性的值都是固定的,无法为创建的每一个实例单独赋值