js面试题2:JS创建一个对象的几种方式

275 阅读2分钟

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')
}

这种方式定于属性不灵活,属性的值都是固定的,无法为创建的每一个实例单独赋值