Javascript高级程序设计——面向对象之创建对象
对象创建方法:
- 工厂方法
- 构造函数模式
- 原型模式
- 组合构造函数和原型模式
- 寄生构造函数模式
- 问题构造函数模式
工厂模式:
function Person(name, age){
var obj = new Object(); //创建对象
obj.name = name; //添加方法、属性
obj.age = age;
obj.sayName = function(){
alert(this.name);
}
return obj; //返回对象
}
var people = Person("yangxunwu", 24);
缺点:返回的对象全部是object的实例,无法完成对象识别
构造函数模式:
function Person(name, age){
this.name = name; //添加方法、属性
this.age = age;
this.sayName = function(){
alert(this.name);
};
}
var people = new Person("yangxunwu", 24);
//注意多了new操作
构造函数创建实例时,必须用new操作符,经历四个步骤:
- 创建对象
- 将构造函数的作用域赋给对象。(this指向新对象)
- 执行构造函数代码。
- 返回新对象。
缺点:虽然创建的实例可以通过instanceof操作符 来识别,但函数无法复用。
原型模式:
function Person(){ //创建空的构造函数
}
Person.prototype.age = age; //构造函数原型上添加属性和方法,达到函数复用
Person.prototype.sayName = function(){
alert(Person.prototype.name);
};
var people = new Person();
当创建一个新函数时,会自动根据特定规则为函数创建prototype属性,这个属性是一个指针指向函数的原型对象,
原型对象会自动的获得一个constructor属性,这也是一个指针,指向拥有这个prototype属性的函数。
Pesson.prototype.constructor = Person
创建自定义构造函数后,其原型对象自动获得constructor属性,其他的方法都从object继承。当通过构造函数创建
一个新实例后,实例自动获得一个指针,指向构造函数的原型对象,一般名称是__proto__属性。
当代码读取某个属性时,一般会经过两个过程一个是在实例上搜索属性,搜索不到就通过__proto__属性到原型对象上搜索。
通过hasOwnProperty()方法,可以检测一个属性是存在实例中还是原型中,实例中返回true。
原型对象上的属性可以让所有实例共享,但是当属性为引用类型时就会容易产生问题。
function Person(){
}
Person.prototype.names = ["yang", "zhang"];
var people1 = new Person();
var people2 = new Person();
people1.names //["yang", "zhang"]
people2.names //["yang", "zhang"]
people1.names.push("test"); //因为属性共享,而且是引用类型,所以names改变了
people1.names //["yang", "zhang", "test"]
people1.names //["yang", "zhang", "test"]
实例一般应该有自己的全部属性,这里没有
组合使用构造函数模式和原型模式
function Person(name, age){ //构造函数继承的属性是独有的
this.name = name;
this.age = age;
this.friends = ["yang", "zhang"];
}
Person.prototype.sayName = function(){ //通过原型模式来共享方法
alert(this.name);
}
//创建实例,实例不共享属性,共享方法
var people1 = new Person("yangxunwu", 24);
var people2 = new Person("hexiaoming", 6);
//访问引用类型
people1.friends; //["yang", "zhang"]
people1.friends; //["yang", "zhang"]
//为添加元素
people1.friends.push("wang");
people1.friends; //["yang", "zhang","wang"] 元素被添加到people1的属性中,因为构造函数不共享属性
people1.friends; //["yang", "zhang"]
people1.sayName === people2.sayName //true。共享方法
动态原型模式:
function Person(name, age){ //动态原型模式
this.name = name;
this.age = age;
this.friends = ["yang", "zhang"];
if(Person.prototype.sayName != "function"){ //动态加载,只在第一次添加原型方法
Person.prototype.sayName = function(){
alert(this.name);
}
};
}
只在第一次调用构造函数时执行,之后原型已经完成初始化。
寄生构造函数模式:
function Person(name, age){
var obj = new Object(); //生成一个Objdetde对象
obj.name = name;
obj.age = age;
obj.sayName = functon(){
alert(this.name);
}
return obj; //返回的一直是Object的对象。
}
var people = new Person("yangxunwu", 24); //与工厂模式的区别,坑
people.sayName(); //yangxunwu
返回的对象与构造函数或者构造函数的原型没关系,而且返回的一直是Object类型。只是把外部干的事放到内部干。
稳妥构造函数:
function Person(name, age){
var obj = new Object();
//定义私有变量和函数
obj.doSomething = function(){
alert(name); //定义可以访问私有变量和函数的方法,没有引用this
}
return obj; //返回对象,现在只有这个对象可以访问这些私有变量和函数。
}
var people = Person("yangxunwu", 24); //没使用new
people.sayName(); //yangxunwu
稳妥构造就是没有公共的属性,不引用this,防止数据被其他应用程序破坏。稳妥构造函数与寄生构造函数不同:
- 新创建的对象方法不引用this
- 不使用new操作符来调用构造函数。
Javascript高级程序设计——面向对象之创建对象的更多相关文章
- Javascript高级程序设计——面向对象小结
ECMAScript支持面向对象编程,对象可以在代码执行时创建,具有动态扩展性而非严格意义上的实体. 创建对象方法: 工厂模式:简单的函数创建引用类型 构造函数模式:可以创建自定义引用类型,可以想创建 ...
- 2020/06/06 JavaScript高级程序设计 面向对象的程序设计
ECMAScript虽然是一种面向对象的语言,但是他没有类的概念.所以他的对象也与其他语言中的对象有所不同. ECMA-262定义对象:一组没有特定顺序的值. 6.1 理解对象 创建对象的方法: 1. ...
- Javascript高级程序设计——面向对象之实现继承
原型链: 构造函数中都有一个prototype属性指针,这个指针指向原型对象,而创建的实例也有指向这个原型对象的指针__proto__.当实例查找方法时先在实例上找,找不到再通过__proto__到原 ...
- Javascript高级程序设计——面向对象之理解对象
在面向对象语言中都有类的概念,通过类来创建具有属性和方法的对象.而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值可以包含基本值.对象.或者函数. 在Ja ...
- 《Javascript高级程序设计》:创建对象
工厂模式 function createPerson(name,age, job){ var o = new Object(); o.name = name; o.age = age; o.job = ...
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...
- 《JavaScript高级程序设计》学习笔记
系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端 ...
- 《Javascript高级程序设计》阅读记录(六):第六章 下
这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...
- 《Javascript高级程序设计》阅读记录(五):第六章 上
这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...
随机推荐
- VS 错误解决(项目-属性-启用调试器)
我是先安装了VS2012, 之后由于需要安装了VS2008, 但在VS2012中可以运行程序但是不能调试, 即按Ctrl+F5可以运行, 但是按F5会提示错误. "尝试运行项目时出错:Unc ...
- 屠蛟之路_集木成舟_ForthDay
下数据库大山,行数里至水岸,无边无际的东海便豁然展现在屠蛟少年的眼前. 要想到达东海之中的蛟灵岛绞杀beta怪蛟,夺回心爱的小公举,少年们首先需要一艘经得起风浪的船.毕竟海上之路暗涌潜伏.同样凶险万分 ...
- 2015年10月份经常使用的linux命令。
ps -ef |grep 服务名 详细的介绍可以参考此篇博客http://www.cnblogs.com/wangkangluo1/archive/2011/09/23/218593 ...
- java编程思想-java集合总结-基本概念
1.java 容器类类库的用途是"保存对象",并将其划分为两个不同的概念: 1)Collection.一个独立元素的序列,这些元素都服从一条或多条规则.List 必须按照插入的顺序 ...
- MSMQ 学习(1)
在 Windows Server 2008 or Windows Server 2008 R2 上安装消息队列 4.0 在服务器管理器中,单击“功能”. 在“功能摘要”下的右窗格中,单击“添加功能”. ...
- php5.1以上版本时间戳_时间戳与日期格式转换_相差8小时 的解决方案
php5.1以上时间戳会与实际时间相差8小时,解决办法如下 .最简单的方法就是不要用php5.1以上的版本--显然这是不可取的方法!!! .修改php.ini.打开php.ini查找date.time ...
- Spring MVC学习笔记——JSR303介绍及最佳实践
JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 Java EE 6 发布,Bean Validation 作为一个 ...
- ubuntu rhythmbox乱码解决方法
因为安装的是双系统,所以音乐文件在win的盘下面,所以采用的方法是 1. 首先,需要有软件包mid3iconv.如果你的系统中没有安装它,可以通过如下代码自动安装:sudo apt-get insta ...
- VIM自动补全插件 - YouCompleteMe--"大神级vim补全插件"
VIM自动补全插件 - YouCompleteMe 序言 vim 之所以被称为编辑器之神多半归功于其丰富的可DIY的灵活插件功能,( 例如vim下的这款神级般的代码补全插件YouCompleteMe) ...
- git命令之git tag 给当前分支打标签
git tag - 标签相关操作 发表于 2011年06月29日 由 机器猫 标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签$ ...