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 ...
随机推荐
- ie兼容性问题汇总
1.eval函数 <script type="text/javascript"> //eval的兼容性 var s="function(){alert('te ...
- jdk7.NIO.2学习笔记之目录文件及权限
package com.zl.jdk7; import java.io.File; import java.io.IOException; import java.nio.file.Path; imp ...
- Tomcat配置自定义访问日志 --- 获取请求头部信息
使用tomcat,搭建完个人网站后,默认记录来访游客的信息是十分有限的,主要有ip和路径以及方法等. 有时候为了获取更多来访信息,比如请求的头部信息,这个时候就需要我们手动配置log了. 开始 进入T ...
- andoid 多线程断点下载
本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多 ...
- Unity5.x发布IOS项目Xcode8免签证调试发布教程
https://www.jianshu.com/p/b0fb49fbcc14 最近尝试发布一下IOS项目,发现现在发布已经简单很多了,不需要开发者账户也能简单快捷进行真机调试. 调试: 1.准备工作 ...
- Python的logger配制文件
1:logger.conf ############################################### [loggers] keys=root,manylog,daylog [lo ...
- 初学Hadoop之中文词频统计
1.安装eclipse 准备 eclipse-dsl-luna-SR2-linux-gtk-x86_64.tar.gz 安装 1.解压文件. 2.创建图标. ln -s /opt/eclipse/ec ...
- Python3.4 获取百度网页源码并保存在本地文件中
最近学习python 版本 3.4 抓取网页源码并且保存在本地文件中 import urllib.request url='http://www.baidu.com' #上面的url一定要写明确,如果 ...
- javascript对HTML字符转义与反转义
1.背景:在项目中,经常遇到一些字符需要进行转义后才能显示到界面上,如“&”,在界面中显示的是“&”,在html中书写“&”,显示在界面的中的依然是“&”. 这时候,就 ...
- Nodejs介绍及npm工具使用
一.Nodejs介绍 Nodejs英文网:https://nodejs.org/en/ Nodejs中文网:http://nodejs.cn/ Node.js 是一个基于 Chrome V8 引擎的 ...