JavaScript面向对象编程之创建对象
参考资料依旧《JavaScript高级程序设计》,不得不说这本书写的太好了,讲的极为清晰凝练,好书!
先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要:
1.实例的指针仅指向原型,而不指向构造函数。
可以随时为原型添加属性和方法,并且修改能够立刻在所有对象实例中表现出来,但如果重写整个原型对象,那么情况就不一样了。调用构造函数是会为实例添加一个指向最初原型的_proto_指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
2.我们不推荐在产品化的程序中修改原生对象的原型。
3.创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式。构造函数模式用来定义实例属性,而原型模式用来定义方法和共享属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存(因为函数也是对象)。另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长。
下面的代码给出了四种构建方法的demo(寄生虫模式和稳妥模式未录入)
1.工厂模式
2.构造函数
3.对象原型
4.构造函数和对象原型组合模式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script language="JavaScript">
// 初试对象
// var person = new Object();
// person.name = "Nicholas";
// person.age = 29;
// person.job = "Software Engineer";
//
// person.sayName = function(){
// alert(this.name);
// };
//
// person.sayName(); // 工厂模式
// function createPerson(name,age,job){
// var o = new Object();
// o.name = name;
// o.age = age;
// o.job = job;
// o.sayName = function(){
// alert(this.name);
// };
// return o;
// }
//
// var person1=createPerson("Nicholas",29,"Softwar Enginner");
// var person2=createPerson("Greg",27,"Doctor");
// person1.sayName();
// person2.sayName(); // 构造函数模式
// 由于工厂模式,可以讲实例表示为一种特定的类型
// function Person(name,age,job) {//按照惯例应大写构造函数的首字母,当然,小写也可以运行
// this.name = name;
// this.age = age;
// this.job = job;
// this.sayName = function(){//sayName后面为什么不加括号?
// alert(this.name);
// };
// }
// var person1 = new Person("Nicholas",29,"Software Enginner");
// var person2 = new Person("Geeg",27,"Doctor");
//
// person1.sayName();
// person2.sayName();
// alert(person1 instanceof Person);
// alert(person2 instanceof Person);
// alert(person1 instanceof Object);
// alert(person2 instanceof Object);
// Person("zhouge",21,"Studet");
// window.sayName();
// var o = new Object();
// Person.call(o,"xiaoli",55,"singer");
// o.sayName();
// 组合使用构造函数模式和原型模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["Shelby","Court"];
} Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
} var person1=new Person("li",22,"SE");
var person2=new Person("zhang",23,"CS");
person1.friends.push("Van");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends=== person2.friends);
alert(person1.sayName === person2.sayName);
</script>
</body>
</html>
JavaScript面向对象编程之创建对象的更多相关文章
- 深入理解JavaScript系列(17):面向对象编程之概论
		
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
 - python基础-面向对象编程之封装、访问限制机制和property
		
面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...
 - Javascript面向对象编程一:基础篇
		
该随笔分为以下四部分: Javascript面向对象编程一:基础篇 Javascript面向对象编程二:封装 Javascript面向对象编程三:继承 Javascript面向对象编程四:控件 先弄个 ...
 - PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
		
这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...
 - python基础-面向对象编程之继承
		
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
 - python基础-面向对象编程之反射
		
面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...
 - python基础-面向对象编程之多态
		
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
 - python基础-面向对象编程之组合
		
面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...
 - 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)
		
介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...
 
随机推荐
- How to add more to Git Bash on Windows
			
How to add more to Git Bash on Windows Download the lastest wget binary for windows from https://ete ...
 - 深入理解JavaScript系列(32):设计模式之观察者模式
			
介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们 ...
 - [转]微信小程序安全浅析
			
本文转自:http://blog.csdn.net/baize_security/article/details/54582854 引言 近期微信小程序重磅发布,在互联网界掀起不小的波澜,已有许多公司 ...
 - 6、Angular Route 路由
			
1.没有嵌套路由 类似 ui-route 上述的html用红字标记的是必须导入的.这是因为:路由并不在ng2中,需要我们额外引入,另外我们需要设置base href,这是个什么东西呢?相当于我们后续所 ...
 - linux安装lua_nginx_module模块
			
ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本,可以用来实现灰度发布.另外淘宝的OpenResty也 ...
 - linux shell基础编程2
			
while循环 语法1: while [ 条件 ] do 命令序列 done 语法2: while read -r line do 命令序列 done (切记while和左中括号一定要有空格) 例子 ...
 - 2、Spring之AOP
			
AOP术语 通知:定义了切面是什么以及何时使用.除了要描述页面要完成的工作,通知还解决了何时执行这个工作的问题. 连接点:连接点是一个物理的存在.这个点可以是调用方法时.抛出异常时.甚至是修改一个字段 ...
 - scss-变量作用域
			
SCSS之所以便利,是因为它具有了编程语言的某些特性. 让原本规则刻板的CSS变的灵活起来,下面介绍一下SCSS中的作用域概念. 几乎所有编程语言都有作用域概念的涉及,原理大同小异,SCSS中的也是如 ...
 - [转]chrome developer tool 调试技巧
			
这篇文章是根据目前 chrome 稳定版(19.0.1084.52 m)写的, 因为 google 也在不断完善chrome developer tool, 所以 chrome 版本不同可能稍有差别. ...
 - PHP连接MySQL数据库的几种方式
			
PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi :MySQLi 只针对 MySQL 数据库,MySQLi 还提供了 API 接口. PDO (PHP Data Objects ...