自用备忘笔记

前言

虽然可以使用 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. Excel的快速录入

    数据有效性: 1.选择要限制数据有效性的区域: 2.点开[数据]选项卡选择”数据验证“: 3.[设置]中选择”序列": 4.若手动输入则需要将内容使用英文符号分割开来(比如:A级,B级): ...

  2. C#与Java AES 加密解密

    参考文档:https://www.cnblogs.com/xbzhu/p/7064642.html 前几天对接Java接口,需要C#加密参数,Java解密.奈何网上找了一堆大同小异的加解密方法都跟Ja ...

  3. jquery判断checkBox的checked

    jquery判断checked的三种方法:.attr('checked):   //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false.prop('c ...

  4. sql 删除默认索引,对象 依赖于 列,由于一个或多个对象访问此列

    declare @name varchar(50)select  @name =b.name from sysobjects b join syscolumns aon b.id = a.cdefau ...

  5. centos6.9设置桥接网络模式方法

    第一步:设置 VMware 在 VMware 中打开[编辑]->[虚拟网络编辑器],添加 VMnet0,并选择桥接模式.需要注意的是,需要选择“桥接到”的网卡,使用无线网卡就选无线网卡,使用有线 ...

  6. Hbase-2.0.0_04_Hbase原理

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

  7. VRS的GPS/BDS双系统网元固定存在的问题

    问题如下:部分网元固定卫星数少于2个. 另外:北方xinkong的网元组网也存在问题

  8. .whl文件打开方式 Python

    wheel文件本质上就是zip或者rar,只不过他更加方便python的安装以及使用.在之前的图片中我们只要使用pip install wheel 就可以安装wheel. 在安装了wheel之后我们可 ...

  9. (13)Python文件操作

  10. Color the ball HDU - 1556 (非线段树做法)

    题意:在1到n的气球中,在不同的区域中涂颜色,问每个气球涂几次. #include<cstdio>int num[100010];int main(){ int n, x, y;; whi ...