自用备忘笔记

前言

虽然可以使用 Object 和对象字面量创建对象,但是如果要创建大量相似的对象又显得麻烦。为解决这个问题,人们开始使用工厂模式的变种。

工厂模式

function person(name, age) {
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function() {
alert(this.name);
};
return o;
} var person1 = person('Nicholas', 29),
person2 = person('Greg', 27);

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

缺点:没有解决对象识别的问题,即不知道生成对象是什么类型。

构造函数模式

function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = function() {
alert(this.name);
};
} var person1 = new Person('Nicholas', 29),
person2 = new Person('Greg', 27);

优点:解决了对象识别的问题,通过对象可以知道它是由哪个构造函数生成的。

person1.constructor == Person  //true
person1 instanceof Person //true
person1 instanceof Object //true

缺点:会在每个实例对象上生成方法,没有达到复用的效果。

person1.sayName == person2.sayName; //false

通过 new 操作符会经历以下 4 个步骤:1. 创建一个新对象;2. 将构造函数的作用域赋给新对象;3. 执行构造函数中的代码;4. 返回新对象。

原型模式

function Person() {}
Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.friends = ['Shelby', Court];
Person.prototype.sayName = function() {
alert(this.name);
}; var person1 = new Person();

优点:原型对象上的属性和方法均可以复用。

缺点:引用类型属性被共享,无法传参数自定义实例对象的属性。

var person1 = new Person(),
person2 = new Person(); person1.friends.push('Van'); console.log(person2.friends); //Shelby, Court, Van

组合模式

function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayName = function() {
alert(this.name);
}; var person1 = new Person('Nicholas', 29);

优点:集合了构造函数模式和原型模式的优点,是最广泛认可的模式。

缺点:构造函数和原型对象的初始化分开书写,对有类概念语言的学习者不友好。

动态原型模式

function Person(name, age) {
this.name = name;
this.age = age;
if (typeof this.sayName == 'function') return;
Person.prototype.sayName = function() {
alert(this.name);
}
} var person1 = new Person('Nicholas', 29);

优点:将原型对象的初始化放入构造函数内部,是最理想的模式。通过检测(任一)方法是否存在,来避免重复对原型对象初始化。

寄生构造函数模式

function Person(name, age) {
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function() {
alert(this.name);
};
return o;
} var person1 = new Person('Nicholas', 29);

缺点:与工厂模式相似,只是通过 new 操作符调用构造函数。与工厂模式一样,无法解决对象识别的问题,不推荐使用。

稳妥构造函数模式

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

function Person(name, age) {
var o = new Object();
o.sayName = function() {
alert(name);
};
return o;
} var person1 = Person('Nicholas', 29);

优点:适用于禁止使用 this 和 new 的场景,安全性高,适合某些安全要求高的环节;属性未绑定在实例对象上,只能通过特点方法访问。

缺点:同样无法识别对象类型。

参考:《高级程序设计(第3版)》

Object-Oriented(一)创建对象的更多相关文章

  1. OO开发思想:面向对象的开发方法(Object oriented,OO)

    面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...

  2. CSharpGL - Object Oriented OpenGL in C#

    Object Oriented OpenGL in C#

  3. Object Oriented Programming python

    Object Oriented Programming python new concepts of the object oriented programming : class encapsula ...

  4. What is Object Oriented Design? (OOD)

    Object Oriented Design is the concept that forces programmers to plan out their code in order to hav ...

  5. Java - 面向对象(object oriented)计划 详细解释

    面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...

  6. JavaScript: Constructor and Object Oriented Programming

    Constructor :  Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...

  7. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  8. Python学习札记(三十) 面向对象编程 Object Oriented Program 1

    参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...

  9. 使用一个数组存储一个英文句子"java is an object oriented programing language"

    class fun { public static void main(String[] args) { String str="java is an object oriented pro ...

  10. 《Using Databases with Python》Week1 Object Oriented Python 课堂笔记

    Coursera课程<Using Databases with Python> 密歇根大学 Charles Severance Week1 Object Oriented Python U ...

随机推荐

  1. python第三十七天--异常--socket

    异常处理 #!usr/bin/env python #-*-coding:utf-8-*- # Author calmyan list_l=['g','h'] data={'} try: #list_ ...

  2. centos-7 虚拟机安装图形界面

    centos-7 虚拟机安装图形界面 想到安装一个docker环境,于是拿出了以前装的虚拟机centos7,记得装完后,没进行任何配置(默认安装的是命令行界面). 配置网络 现有的虚拟机是没有办法联网 ...

  3. 基于LNMP(fastcgi协议)环境部署、原理介绍以及fastcgi_cache配置以及upstream模块负载均衡讲解

    ngx_http_proxy_module只能反向代理后端使用HTTP协议的主机.而ngx_http_fastcgi_module只能反向代理后端使用FPM或者使用FastCGI协议的客户端. 一.部 ...

  4. Hbase-2.0.0_04_Hbase原理

    参考博客:Hadoop HBase概念学习系列 参考博客:Hadoop HBase概念学习系列之HBase里的Zookeeper(二十一) 参考博客:Hadoop HBase概念学习系列之HBase里 ...

  5. January 13th, 2018 Week 02nd Saturday

    Anyone who has no spiritual aspirations is an idiot. 任何没有精神追求的人都是愚昧无知的人. Today I went to a bookshop ...

  6. java死锁示例及其发现方法

    在java多线程编程中很容易出现死锁,死锁就是多个线程相互之间永久性的等待对方释放锁,这和数据库多个会话之间的死锁类似.下面的代码示例了一个最简单的死锁的例子,线程1和线程2相互之间等待对方释放锁来取 ...

  7. selenium 初探

    # -*- coding:utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() # 打开firefox浏览器 dr ...

  8. UOJ #390. 【UNR #3】百鸽笼

    UOJ #390. [UNR #3]百鸽笼 题目链接 看这道题之前先看一道相似的题目 [PKUWC2018]猎人杀. 考虑类似的容斥: 我们不妨设处理\(1\)的概率. 我们令集合\(T\)中的所有鸽 ...

  9. swift class的动态派发

    一.测试代码 class BaseCallClass{ func NormalCall(){} @objc func OcCall(){} @objc dynamic func OcDynamicCa ...

  10. python随机生成6位数验证码

    #随机生成6位数验证码 import randomcode = []for i in range(6):    if i == str(random.randint(1,5)):        cod ...