可以通过 Object 构造函数或对象字面量的方式创建对象,但是这些方式的缺点是使用同一个接口创建多个对象,会产生大量重复的代码。

1.工厂模式

function createPerson(name, age, job) {
  var o = new Object();
  o.name = name;
  o.age = age;
  o.job = job;
  o.sayName = function () {
    console.log(this.name);
  }
  return o;
}
​
var person1 = createPerson('Nike', 18, 'Student');
console.log(person1.constructor.name) // Object

优点:解决了创建多个相似对象的问题。

缺点:没有解决对象的识别问题(如何知道一个对象的类型)

2.构造函数模式

function Person(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = function () {
    console.log(this.name);
  }
}
​
var person1 = new Person('Nike', 18, 'Student');
console.log(person1.constructor.name) // Person

优点:可以将构造函数的实例标识为一种特定的类型

缺点:每个方法在每个实例上都要重新创建一次(它们做的事情都一样),如果方法写成全局函数就没有封装性可言了。

3.原型模式

function Person () {}
Person.prototype = {
  constructor: Person,
  name: 'Nike',
  friends: ['阿猫', '阿狗']
}
​
var person1 = new Person();
var person2 = new Person();
​
person1.friends.push('阿黄');
console.log(person1.friends); // ['阿猫', '阿狗', '阿黄']
console.log(person2.friends); // ['阿猫', '阿狗', '阿黄']

缺点

  • 不能用构造函数传递初始化参数,使得所有实例默认情况下取得相同的属性值。

  • 原型中的属性在很多实例中共享,当属性是基本值的时候可以实例上添加一个同名属性隐藏原型中对应的属性,但当属性是引用类型的时候,修改一个实例的属性时是在原型上直接修改的,其它实例的属性也会更着改变。

4.组合使用构造函数和原型模式

function Person(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
  this.friends: ['阿猫', '阿狗']
}
Person.prototype = {
  constructor: Person,
  sayName : function () {
    console.log(this.name);
  }
}
​
var person1 = new Person('Nike', 18, 'Student');
var person2 = new Person('Bob', 22, 'Doctor');
​
person1.friends.push('阿黄');
console.log(person1.friends); // ['阿猫', '阿狗', '阿黄']
console.log(person2.friends); // ['阿猫', '阿狗']

思想:用构造函数模式定义实例属性,原型模式定义方法和共享的属性

优点

  • 每个实例都有自己的一份属性的副本,同时共享着方法的引用,节约内存

  • 支持构造函数传参

5.动态原型模式

function Person(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
  if (typeof this.sayName != 'function') { // 检查初始化之后应该存在的任何属性和方法
    Person.prototype.sayName = function () {
      console.log(this.name)
    }
  }
}
​
var friend = new Person('Nike', 18, 'Student');
friend.sayName();

优点:通过检测某个应该存在的方法在构造函数中初始化原型(必要情况下),即同时使用构造函数和原型

注意:使用动态原型模式是不能使用对象字面量重写原型,因为在已经创建了实例的情况下重写原型会切断现有实例和原型之间的联系。

6.寄生构造函数模式

function Person(name, age, job) {
  var o = new Object();
  o.name = name;
  o.age = age;
  o.job = job;
  o.sayName = function () {
    console.log(this.name);
  }
  return o;
}
​
var friend  = new Person('Nike', 18, 'Student');
friend.sayName(); // Student
​
// ======================================================== //
​
function Sp () {
    var values = new Array();
    values.push.apply(values, arguments);
    values.toPip = function () {
        return this.join("|")
    }
    return values;
}
​
var colors = new Sp('red','blue','pink');
console.log(colors.toPip()) // red|blue|pink

优点:可以在一些特殊情况下为对象创建构造函数

注意:

  • 构造函数没有return的时候,默认会返回新对象实例,有return的时候,可以重写调用构造函数时返回的值。

  • 返回的对象和构造函数或构造函数的原型属性间没有关系。不能用instanceof 确定对象类型

7.稳妥构造函数模式

function Person(name, age, job) {
  var o = new Object();
  o.sayName = function () {
    console.log(name);
  }
  return o;
}
​
var friend  =  Person('Nike', 18, 'Student');
friend.sayName(); // Nike 该属性只能通过 sayName 方法访问

概念:稳妥对象,是指没有公共属性,而且其方法不引用 this 的对象。

优点:安全的环境中(禁止使用 this 或 new),或防止数据被其他应用程序改动

注意:

  • 创建对象的实例方法不引用 this;不使用 new 操作符调用构造函数。

  • 返回的对象和构造函数或构造函数的原型属性间没有关系。不能用instanceof 确定对象类型

javascript 之 对象的更多相关文章

  1. javascript 全局对象--w3school

    JavaScript全局对象 1.  decodeURI()解析某个编码的URI. 2.decodeURInComponent()解析一个编码的URI组件. 3.encodeURI()把字符串编码为U ...

  2. JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString

    JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...

  3. 从零构建JavaScript的对象系统

    一.正统的类与继承 类是对象的定义,而对象是类的实例(Instance).类不可直接使用,要想使用就必须在内存上生成该类的副本,这个副本就是对象. 以Java为例: public class Grou ...

  4. 关于javascript自定义对象(来自网络)(最近几天不会的)

    javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...

  5. 据说每个大牛、小牛都应该有自己的库——JavaScript原生对象拓展

    在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏,一是,关于写个自己的库的想法由来 ...

  6. JavaScript RegExp 对象

    JavaScript RegExp 对象 RegExp 对象用于规定在文本中检索的内容. 什么是 RegExp? RegExp 是正则表达式的缩写. 当您检索某个文本时,可以使用一种模式来描述要检索的 ...

  7. JavaScript String 对象

    JavaScript String 对象 String 对象 String 对象用于处理文本(字符串). String 对象创建方法: new String(). 语法 var txt = new S ...

  8. JavaScript Math 对象

    JavaScript Math 对象 Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). 语法 var ...

  9. JavaScript Number 对象

    JavaScript Number 对象 Number 对象 Number 对象是原始数值的包装对象. Number 创建方式 new Number(). 语法 var num = new Numbe ...

  10. JavaScript Array 对象

    JavaScript Array 对象 Array 对象 Array 对象用于在变量中存储多个值: var cars = ["Saab", "Volvo", & ...

随机推荐

  1. flask框架下的jinja2模板引擎(2)(过滤器与自定义过滤器)

    flask框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html 这篇论文主要用来记录下 jinja2 的过滤器. 什么是过 ...

  2. macvtap与vhost-net技术

    MacVlan的功能是给同一个物理网卡配置多个MAC地址,可以在软件上配置多个以太网口,属于物理层的功能.MacVTap是用来替代TUN/TAP和Bridge内核模块的.MacTap是基于MacVla ...

  3. 学习笔记:Nginx反射代理使用缓存和删除其缓存文件的方法

    使用nginx做cache服务器 需求就是缓存android的软件包,后缀名是apk.话不多说,直接上配置,供参考: a-->nginx.conf user www www; worker_pr ...

  4. CC150相关问题

    18.9 动态计算中位数 利用两个堆:一个最大堆,存放小于中位数的值:一个最小堆,存放大于中位数的值. 则两个堆的堆顶即为数组中最中间的两个数. 在插入新元素的时候,我们只要维护两个堆, 使其堆中元素 ...

  5. python使用SQLAlchemy对mysql操作

    安装SQLAlchemy pip install sqlalchemy 在MySQL的test数据库中创建的user表,用SQLAlchemy来试试 数据库连接 第一步,导入SQLAlchemy,并初 ...

  6. 【Win10+eclipse+MinGW+QT安装教程】已有eclipse环境下配置QT插件出错详解

    (纪念一下装了一整天濒临绝望的自己[/doge]) (以下所有下载项一律使用32位) step1:下载安装eclipse.适配的jdk.MinGW和QT 1.下载32位eclipse for c++以 ...

  7. 020.2.2 runtime类

    基本不用,简单看一下就行了 1.属于单例的一个实例,可以通过getRuntime()获取对象Runtime r = Runtime.getRuntime();r.exec("winmine. ...

  8. java构造方法-this关键字的用法

    public class constructor { public static void main(String[] args) { // TODO Auto-generated method st ...

  9. Oracle数据库用户名密码【转载自百度经验】

    登录到安装oracle数据库服务器的操作系统.打开命令窗口:(我的演示机器是windows)   查看环境变量ORACLE_SID的设置情况: windows: echo %ORACLE_SID% l ...

  10. [转] Spark-Sql On YARN自动调整Executor数配置

    在所有的NodeManager中,修改yarn-site.xml,为yarn.nodemanager.aux-services添加spark_shuffle值,并设置yarn.nodemanager. ...