Object-Oriented(一)创建对象
自用备忘笔记
前言
虽然可以使用 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(一)创建对象的更多相关文章
- OO开发思想:面向对象的开发方法(Object oriented,OO)
面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...
- CSharpGL - Object Oriented OpenGL in C#
Object Oriented OpenGL in C#
- Object Oriented Programming python
Object Oriented Programming python new concepts of the object oriented programming : class encapsula ...
- What is Object Oriented Design? (OOD)
Object Oriented Design is the concept that forces programmers to plan out their code in order to hav ...
- Java - 面向对象(object oriented)计划 详细解释
面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...
- JavaScript: Constructor and Object Oriented Programming
Constructor : Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...
- 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性
一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...
- Python学习札记(三十) 面向对象编程 Object Oriented Program 1
参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...
- 使用一个数组存储一个英文句子"java is an object oriented programing language"
class fun { public static void main(String[] args) { String str="java is an object oriented pro ...
- 《Using Databases with Python》Week1 Object Oriented Python 课堂笔记
Coursera课程<Using Databases with Python> 密歇根大学 Charles Severance Week1 Object Oriented Python U ...
随机推荐
- OneAPM大讲堂 | Java 异常日志记录最佳实践
[编者按]本文作者是 Casey Dunham.Casey 是一位具有 10 多年经验的专业软件开发人员,以其独特的方式应对应用安全问题而闻名.本文系国内 ITOM 管理平台 OneAPM 工程师编译 ...
- Django的认证系统—auth模块
Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...
- 非对称加密与GPG/PGP
最近浏览博客的时候,经常会看到博主展示出自己的公钥,于是对 GPG/PGP 产生兴趣.下面简单记录相关文章的链接,方便以后了解. 简介: 1991年,程序员Phil Zimmermann为了避开政府的 ...
- NetBeans数据库笔记---三层架构
1.创建数据库,数据表 用MySQL数据库和Navicat for MySQL工具创建表 2.创建实体类——反应表结构(列——变量) 也就是对应表建立的gets和sets方法,实体类的名字一般都与数据 ...
- s面向对象的写法
js面向对象的写法 一.在html中引入该js文件,使用时: <script> var BuyBw8Product = new buyBw8Product(); </script&g ...
- Appium1.9.1 部署及结果检验
1.官网下载最新的 appium 2.点击 Download Appium 3.选择适用于自己操作系统的版本,我的是 windows版本,就选择如下红圈起的 4.点击安装,一直点 下一步 直到提示安装 ...
- jquery的自定义事件通过on绑定trigger触发
jquery绑定自定义事件,可以实现预先绑定好一个处理方法,当需要使用的时候利用jquery trigger来触发自定义事件,以达到方便快捷的目的.我们来假设一个这样的场景,一个textarea中的字 ...
- centos7下安装docker(12.2自定义网络)
通常默认的情况下我们使用的是docker的bridge的网络,用户也可以根据自己的业务需要,创建user-defined docker 提供三种user-defined网络驱动:bridge,over ...
- [USACO09JAN]安全出行Safe Travel
题目 什么神仙题啊,我怎么只会\(dsu\)啊 我们考虑一个非常暴力的操作,我们利用\(dsu\ on \ tree\)把一棵子树内部的非树边都搞出来,用一个堆来存储 我们从堆顶开始暴力所有的边,如果 ...
- 2、JUC--CAS算法
CAS (Compare-And-Swap) 是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问. CAS 是一种无锁的非阻塞算法的实现. C ...