自用备忘笔记

前言

虽然可以使用 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. SQLServer数据集合的交、并、差集运算

    SQLServer2005通过intersect,union,except和三个关键字对应交.并.差三种集合运算. 他们的对应关系可以参考下面图示 相关测试实例如下: use tempdb go if ...

  2. SQL SERVER2008判断文件夹是否存在并创建文件夹

    原文地址:https://www.cnblogs.com/iiwen/p/7650118.html DECLARE @PATH VARCHAR(255) --路径 DECLARE @DATE VARC ...

  3. 【PAT】B1055 集体照(25 分)

    很简单的two points问题 ##注意:K是行数 #include<stdio.h> #include<string.h> #include<map> #inc ...

  4. 使用Jenkins+gitlab自动化构建时排除分支

    我们的目的是gitlab上的代码有变动时会自动向Jenkins发送web钩子请求,触发指定的动作: 但默认情况下,所有分支(如测试环境和预生产)的代码有变动时都会触发,此时可以在Jenkins的项目设 ...

  5. 布局:高度已知,布局一个三栏布局,左栏和右栏宽度为200px,中间自适应

    需求:高度已知为200px,写出三栏布局,左栏和右栏各位200px,中间自适应,如下图所示: 方法一:float浮动布局 原理是:定义三个区块,需要注意的是中间的区块放在右边区块的下面,统一设置高度为 ...

  6. XML Namespace (xmlns) 属性

    http://www.w3school.com.cn/xml/xml_namespaces.asp XML Namespace (xmlns) 属性 XML 命名空间属性被放置于元素的开始标签之中,并 ...

  7. UVA816-Abbott's Revenge(搜索进阶)

    Problem UVA816-Abbott's Revenge Accept: 1010  Submit: 10466 Time Limit: 3000 mSec Problem Descriptio ...

  8. leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree

    104: class Solution { public: int maxDepth(TreeNode* root) { if(root == NULL) ; int left = maxDepth( ...

  9. Objective-C weak深入理解

    1.weak是弱引用,所引用的对象计数不会加1. 2.weak变量在其引用的对象被销毁之后,会被置为nil. 3.weak通常用于block, delegate, NSTimer,以解决循环引用带来的 ...

  10. QT 字符串的使用技巧总结

    QT 的字符串的 使用的总结. 1.字符串截取函数的使用 QString str; QString csv = "forename,middlename,surname,phone" ...