JS中定义对象的几种方式

JS中定义对象的几种方式

  • 字面量及基于已有对象扩充其属性和方法
  • 工厂模式
  • 构造函数的方式
  • 基于原型(prototype)的方式
  • 动态原型的方式
  • ES6的Class

一,字面量及基于已有对象扩充其属性和方法

let obj = {}
obj.name = 'Jett'
obj.sayHello = function () {
  console.log('Hello, ', this.name)
}
View Code

弊端: 可复用性不强(只适用于临时生成的一个对象),如果需要使用多个对象,还需要重新扩展其属性和方法

二,工厂模式

function createObject(username, password) {
  let object = new Object();

  object.username = username;
  object.password = password;

  object.get = function () {
    alert(this.username + ", " + this.password);
  }

  return object;
}
View Code

工厂模式的实质还是基于已有对象扩充其属性和方法,只不过把创造对象的方法封装了,当需要创建多个对象的时候不需要重复写代码。

不过上面的有个缺陷就是每次创建对象的时候,对象的对应的方法都会被创建一次,即方法不能被创建的所有对象共享。

优化:

let get = function () {
    alert(this.username + ", " + this.password);
}
function createObject(username, password) {
  let object = new Object();

  object.username = username;
  object.password = password;

  object.get = get

  return object;
}
View Code

扩展:JS实现单例模式

let Singleton = function( name ){
    this.name = name;
};

Singleton.prototype.getName = function(){
   alert(this.name);
};

Singleton.getInstance = (function(){ 
  let instance = null;
  return function (name) {
    if (!instance) {
      instance = new Singleton(name);
    }
    return instance;
  }
})();
View Code

三,构造函数方式

function Person (username, password) {
  //在执行第一行代码前,js引擎会为我们生成一个对象
  this.username = username;
  this.password = password;
  this.getInfo = function () {
    alert(this.username + ", " + this.password);
  } 
  //此处有一个隐藏的return语句,用于将之前生成的对象返回
  //只有在后面用new来调用构造函数的情况下,才会出现注释所述的这两点情况
}
View Code

该方法的弊端也是跟工厂模式类似,对于一些公有的方法需要重复声明

四,基于原型prototype

对象会从其原型上继承属性和方法,所以我们可以把公有的属性放在原型上,把私有的属性放在构造函数内部

原型+构造函数

//使用原型+构造函数方式来定义对象
function Person (username, password) {
  //在执行第一行代码前,js引擎会为我们生成一个对象
  this.username = username;
  this.password = password;
  //此处有一个隐藏的return语句,用于将之前生成的对象返回
  //只有在后面用new来调用构造函数的情况下,才会出现注释所述的这两点情况
}
// 在构造函数的原型属性上添加公有方法/属性
Person.prototype.getInfo = function() {
  alert(this.username + ", " + this.password);
}
View Code

五,动态原型的方式

在构造函数内部通过标志量让所有对象共享一个方法

//使用原型+构造函数方式来定义对象
function Person (username, password) {
  //在执行第一行代码前,js引擎会为我们生成一个对象
  this.username = username;
  this.password = password;
  //此处有一个隐藏的return语句,用于将之前生成的对象返回
  //只有在后面用new来调用构造函数的情况下,才会出现注释所述的这两点情况
  if (Person.flag === undefined) {
    // 在构造函数的原型属性上添加公有方法/属性
    Person.prototype.getInfo = function() {
      alert(this.username + ", " + this.password);
    }
    Person.flag = true
  }
}
View Code

没多大意义,跟四区别不大

六,ES6 的Class

在Class的构造函数中的属性为私有属性,Class内声明的方法为公有属性

class Person {
  constructor (username, password) {
    // 定义私有属性
    this.username = username;
    this.password = password;
  }
  // 公有方法
  getInfo = function() {
      alert(this.username + ", " + this.password);
  }
}
View Code

 

posted @ 2020-04-13 19:37  JettWoo  阅读(1284)  评论(0编辑  收藏  举报