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 ...
随机推荐
- 案例45-crm练习改写客户列表使用struts2&OGNL
1 修改CustomerAction代码 2 修改jsp/customer/list.jsp代码 <%@ page language="java" contentType=& ...
- 用PHP实现同一个帐号不允许同时登陆,只允许一个帐号登录?
数据库表 user_login_info 字段:id,user_ip,user_id,last_access_time user_id 做唯一性索引 1. 用户登录后 如果没有当前用户的数据,插入一条 ...
- centos6.5 源码编译 mysql5.6.21
1.yum安装各个依赖包 [root@WebServer ~]# yum -y install gcc gcc-devel gcc-c++ gcc-c++-devel autoconf* automa ...
- [转]JS组件系列——BootstrapTable 行内编辑解决方案:x-editable
本文转自:http://www.cnblogs.com/landeanfen/p/5821192.html 阅读目录 一.x-editable组件介绍 二.bootstrapTable行内编辑初始方案 ...
- ThinkPHP3.2 整合支付宝RSA加密方式
RSA核心加密验证算法 <?php /** * RSA签名 * @param $data 待签名数据 * @param $private_key 商户私钥字符串 * return 签名结果 */ ...
- 2、Angular2 Directive
1.Attribute directives 2.directive的理解
- python学习(三)--跟着例子写的贴吧网页爬取
from urllib import requestimport urllib #爬贴吧网页文件到本地.首先在本地打开百度贴吧 搜索 java吧#第一页的内容是:http://tieba.baidu. ...
- Jmeter压力测试入门操作
Jmeter压力测试入门 1. 前言 Jmeter 是Apache组织开发的基于Java的压力测试工具,开源并且支持多个操作系统,是一款很好的HTTP测试工具.本篇文章主要的目的是帮助没有接触过J ...
- MyBatis 中 sqlmapconfig核心标签typeAliases配置说明
标签说明 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType.resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声 ...
- Spring课程 Spring入门篇 4-9 Spring bean装配之对jsr支持的说明
1 解析 1.1 疑问:2.2去掉@resource注解,为什么不能赋值?不是有set方法了吗? 1.2 @resource注解版本支持 1.3 没有显式指定@resource的那么,默认名称从何获得 ...