创建对象
方法一:构造函数创建对象
let myObject=new Object();
myObject.name="Lao"; //为对象定义属性
myObject.sayHi=function(){
console.log("Hi");
}//为对象添加方法
方法二:对象字面量表示法创建对象
let myObject={
name:"lao",
sayHi:function(){
console.log("Hi")
}
}
访问对象属性
方法一:点语法
myObject.name;//lao
方法二:方括号
let key="name";
myObject[key]; //lao
使用不同模式创建对象
工厂模式
fuction createPerson(name,age,obj){
let o =new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
console.log(this.name);
};
return o;
}
let person1=createPerson("lao",22,"Software Engineer");
let person2=createPerson("Jia",21,"FrontEnd Engineer");
- 优点:
- 调用时,只需要传入对应的值,就可以自动生成对象
- 屏蔽对象创建的具体实现,只需关心接口传入的参数即可。
- 缺点:
- 只能产生一样数据模型的对象,若要产生新的数据模型对象,需要添加具体类和对象的实现工厂。
- 没有结局对象标识符问题(即新创建的对象是什么类型)(即两个实例中的construtor没有指向)
构造函数模式
PS:构造函数名称的首字母都是要大写的
方法一:【函数声明形式】的【构造函数模式】
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
console.log(this.name);
}
}
let person1=new Person("Lao",22,"Software Engineer");
let person2=new Person("Jia",23,"frontEnd Engineer");
方法二:【函数表达式】的【构造函数模式】
let Person=function(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
console.log(this.name);
}
}
let person1=new Person("Lao",22,"Software Engineer");
let person2=new Person("Jia",23,"frontEnd Engineer");
-
对比[工厂模式](# 工厂模式)
-
特点:
- 没有显式地创建对象。(即没有在内部new Object);
- 属性和方法直接赋值给this
- 没有return
- 使用new操作符创建对象示例
-
优点:
-
实例都有constructor属性指向构造函数。
console.log(person1.constructor == Person);//true
console.log(person2.constructor == Person);//true
-
-
缺点:
-
定义的方法会在每个实例上都创建一遍。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=new Function("console.log(this.name)"); //相当于重新实例了一个方法
}
console.log(person1.sayName == person2.sayName); // false【成为缺点的原因】
- 都是做一样的事,所以没必要定义两个不同的 Function 实例
【解决方法】将函数定义转移到构造函外部
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=sayName; //等于全局函数,属性包含的只是一个指向外部函数的指针。
}
function sayName(){
console.log(this.name);
}
//person1和person2- 依旧存在的问题:
- 全局作用域被搞乱了
- 对象需要多个方法,则需要在全局作用域中定义多个函数
- 导致自定义类型引用的代码不能很好地聚集一起
- 全局作用域被搞乱了
- 【解决办法】原型模式
-
-
原型模式
方法一:【函数声明形式】的【原型模式】
function Person(){}
Person.prototype.name="Lao";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
console.log(this.name);
}
let person1 = new Person();
let person2 = new Person();
方法二:【函数表达式】的【原型模式】
let Person=function(){}
Person.prototype.name="Lao";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){ //方法直接添加到对象的prototype属性上
console.log(this.name);
}
let person1 = new Person();
let person2 = new Person();
- 对比[构造函数模式](# 构造函数模式)
- 优点
- 原型模式定义的属性和方法是由所有实例共享的。(即访问的方法是同一个)
- 优点