JavaScript高级程序设计--对象创建的三种方法

创建对象的三种方法:
1、工厂模式
工厂模式是软件工程领域广为人知的设计模式,这种模式抽象了创建具体对象的过程。下面是使用工厂函数创建对象的的一个例子。

2.构造函数:

从上面的例子中,我们看到构造函数与工厂函数不同之处:
1、没有显式的创建对象
2、直接将属性和方法赋给了this对象,没有return语句
另外,函数名Person使用了首字母大写。(这是一个惯例,构造函数始终都应该以一个大写字母开头,而非构造函数应该以一个小写字母开头。)
使用构造函数来创建对象,意味着你可以获取对象的类型。这也正是构造函数胜过工厂模式的地方。检测对象类型,常用instanceof操作符。

3.原型继承:
我们使用构造函数创建的两个对象person1和person2,既是Person对象的实例,也是Object对象的实例。这是因为,所有对象都间接或直接继承自Object。使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一次,这是没有必要的。通过把方法的定义转移到构造函数外部来解决这个问题。可以通过使用原型模式来解决这个问题。

创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,即原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。
可以看到,person1和person2共享了他们的原型对象的属性和方法。也就是说,person1和person2访问的是同一组属性和同一个方法。
上面的person1和person2实例都叫Jason,我们本打算person1叫Jason,person2叫Poppy的,该怎么做?

上面的例子可以看到,person2的信息被改过来了,是我们想要的。为什么?当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性;注意,是屏蔽,原型对象中的同名属性并没有发生改变。
前面例子中每添加一个属性和方法就要敲一次Person.prototype。更好的做法是用一个包含所有属性和方法的对象字面量来重写对象原型,如下所示。要注意的是,重写之前和重写之后new出来的对象实例,其实指向了不同的对象原型。

额外包含了一个constructor: Person,是因为通过字面量形式创建的对象会自动获得constructor属性,而这个属性没有指向Person函数。
JavaScript高级程序设计--对象创建的三种方法的更多相关文章
- JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)
1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一 ...
- JS对象创建的几种方法
最近一直在看JS高级程序设计这本书,有空来梳理一下几种创建对象的方式.话不多说,直接步入正题. 第一种:Object构造函数创建 var Person = new Object(); Person.n ...
- JavaScript高级程序设计---学习笔记(三)
函数表达式 定义函数的方式有两种:一种是函数声明,另一种是函数表达式. 关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之前会先读取函数声明所以可以把函数声明放在调用它的语句后面. 而 ...
- 【JavaScript回顾】对象创建的几种模式
组合使用构造函数模式和原型模式 创建自定义类型的常见方式,就是组合使用构造函数模式与原型模式.构造函数模式用于定义实 例属性,而原型模式用于定义方法和共享的属性.结果,每个实例都会有自己的一份实例属性 ...
- 线程创建的三种方法:继承Thread类,实现Runnable接口,实现Callable接口
线程创建 三种创建方式 1. 继承Thread类 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程 线程不一定执行,CPU按排调度 pa ...
- c++11线程创建的三种方法
一.用一个初始函数创建一个线程 直接看代码:注意c++在运行一个可执行程序的时候(创建了一个进程),会自动的创建一个主线程,这个主线程和进程同生共死,主线程结束,进程也就结束了. #include & ...
- url地址数据参数转化JSON对象(js三种方法实现)
当我们用get方法提交表单时,在url上会显示出请求的参数组成的字符串,例如:http://localhost:3000/index.html?phone=12345678901&pwd=12 ...
- 《JAVASCRIPT高级程序设计》创建对象的七种模式
细看javascript创建对象模式的诞生,具体的脉络为:不使用任何模式——工厂模式——构造函数模式——原型模式——组合使用构造函数模式——动态原型模式——寄生构造函数模式——稳妥构造函数模式.每一种 ...
- JavaScript高级程序设计学习笔记第三章--基本概念
一.标识符: 1.区分大小写 2.命名规则: 第一个字符必须是一个字母.下划线(_)或一个美元符号($) 其他字符可以是字母.下划线.美元符号或数字 标识符中的字母也可以包含扩展的 ASCII 或 U ...
随机推荐
- CefSharp49.0.1 SetZoomLevel
SetZoomLevel(double zoomLevel) -8<= zoomLevel <=9 Each zoom level increases the zoom by 20%. ...
- C# 三元运算
x=,y=; z=x>y? : 结果z= x=,y=; z=x>y? : 结果z=
- C# Winform欢迎窗体实现()
方法一.program.cs 中先启动欢迎窗体,然后注册程序运行空闲去执行主程序窗体相应初始化代码 static void Main(string[] args) { Application.Enab ...
- “网易大数据讲堂第一期:数说”直播活动资料:课程回放收看及PPT下载
欢迎访问网易云社区,了解更多网易技术产品运营经验. "网易大数据讲堂第一期:数说"直播活动昨晚顺利举行.感谢各位"数"友的支持和参与. 本次活动PPT可点击这里 ...
- nginx: [emerg] directive "location" has no opening "{" in /usr/local/nginx//conf/nginx.conf:75
1.报错:[emerg]directive "location" has no opening "{" in ..... 解决方法: 由于对应行或者附近行的“{ ...
- localStorage、sessionStorage、cookie的有效期和作用域问题
sessionStorage,localStorage,cookie都可以实现客户端存储,三者的区别有哪些了? cookie作为最早期的被设计web浏览器存储少量数据,从底层看,它是作为http协议的 ...
- CSS之引入样式
CSS引入样式 内部样式 内嵌式是将CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义,其基本语法格式如下: <head> <style type=&quo ...
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
- 使用box-shadow 实现水波、音波的效果
用到的工具 animation box-shadow html: <div class="watersource"> </div> css: .waters ...
- git学习--clone和pull
clone:从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库.(clone是将一个库复制到你的本地,是一个本地从无到有的过程) pull:从远程服务器获取到一个branch分支的更新到本 ...