自用备忘笔记

前言

虽然可以使用 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. Linux 装机必备工具

    linux 装机必备工具:安装这些基本能满足日常需求. #!/usr/bin/env sh   echo "Env"       # vim   # tmux   # ssh   ...

  2. java web中java和python混合使用

    利用java web技术展示python算法处理后的数据 工具/原料   myeclipse10 pycharm+Anaconda2 方法/步骤     首先安装配置好pycharm+Anaconda ...

  3. 【PAT】B1036 跟奥巴马一起编程(15)(15 分

    #include<stdio.h> int main() { int row,col; char c; scanf("%d %c",&col,&c); ...

  4. rows的参数

    ds.Tables[0].Rows[0][0].ToString()中的rows后边的那俩参数分别代表什么 第一个0表示行的索引(如果是0就表示第一行,1表示第二行……)第二个0表示列的索引(如果是0 ...

  5. python之字符串的常用操作(转)

    1. 字符串的操作 字符串的连接操作 符号: + 格式:str1 + str2 例如:str1 = 'I Love' str2 = 'You!' print(str1 + str2) >> ...

  6. vue文件在编辑器Sublime Text3中高亮

    编写代码时,代码在编辑器中显示高亮,一方面,在感官方面使人觉得很舒服:另一方面,还可以提高开发效率.下面简单介绍vue文件在Sublime Text3 中高亮的vue插件的安装方法: 第一步:安装Pa ...

  7. WPFの数据源事件变更通知

    如果数据绑定的目标是TextBox元素的Text属性,那么默认会使用双向绑定(Mode.TwoWay),此时用户可以通过更改TextBox元素Text属性的值从而更新源属性信息,但是如果在程序代码中更 ...

  8. AI 机器学习基础

    深度学习是机器学习的一个特定分支. 1.学习算法 对于某类任务T和性能度量P, 2.线性回归 3.正规方程(normal equation) 4.监督学习(supervised learning) 5 ...

  9. luogu P1439 【模板】最长公共子序列(LCS)

    题目qwq (第一道蓝题) 先把第一个序列每个数出现的顺序记下来(数字本身不用记), 然后第二个序列的每个数都对照它的顺序,这样只要得到一个升序的序列就行了qwq 如果遇到出现顺序在前面的数,就用二分 ...

  10. C#位运算实际运用

    前言 前几天写了一篇关于c#位操作,c#位运算基本概念与计算过程 最后提到一个实际问题 需求:C# 用两个short,一个int32拼成一个long型 要求:现在有两个short和一个int,需要拼成 ...