JavaScript_几种创建对象(2017-07-04)
理解对象
1.创建Object实例
var clock = new Object();
clock.hour = 12;
clock.minute = 10;
clock.showHour = function() {
alert(clock.hour);
}; clock.showHour(); //调用
属性是可以动态添加,修改的
2.对象字面量
var clock = {
hour: 12,
minute: 10,
second: 10,
showTime: function() {
alert(this.hour + ":" + this.minute + ":" + this.second);
}
}
clock.showTime(); //调用
对象字面量方式创建对象是首选
创建对象
1.工厂模式:(不推荐使用这种方式创建对象,但应该了解)
//就是一个函数,然后放入参数,返回对象,流水线工作
function createClock(hour, minute, second) {
var clock = new Object();
clock.hour = hour;
clock.minute = minute;
clock.second = second;
clock.showHour = function() {
alert(this.hour + ":" + this.minute + ":" + this.second);
};
return clock;
};
var newClock = createClock(12, 12, 12); //实例化
newClock.showHour(); //调用
说明:
不能识别对象的类型(instanceof 根据实例对象的内部属性__proto__与函数的原型对象是否相等来判断实例是否属于该对象类型的)
2.构造函数模式(不推荐使用这种方式创建对象,但仍需要了解)
function clock(hour, minute, second) {
this.hour = hour;
this.minute = minute;
this.second = second;
this.showTime = function() {
alert(this.hour + ":" + this.minute + ":" + this.second);
}
}
var newClock = new clock(12, 12, 12);
alert(newClock.hour);
注意:这个new关键字是必须,如果不加,clock就不会当成构造函数调用,而只是一个普通的函数。同时,还会意外地给他的外部作用域即window添加属性,因为此时构造函数内部的this已经映射到了外部作用域了。所以为了安全起见,可以这样创建
function clock(hour, minute, second) {
if (this instanceof clock) {//new的实例是否为clock类型,如果不用this代表作用域可能是全局global变量。
this.hour = hour;
this.minute = minute;
this.second = second;
this.showTime = function() {
alert(this.hour + ":" + this.minute + ":" + this.second);
}
} else {
throw new Error("please add 'new' to make a instance");
}
}
说明:
与工厂方式相比,使用构造函数方式创建对象,无需再函数内部重建创建对象,而使用this指代,并而函数无需明确return。
由于this指针在对象实例的时候发生改变指向新的实例。这时新实例的方法也要重新创建,如果n个实例就要n次重建相同的方法。
3.原型模式(不推荐使用这种方式创建对象,但仍需要了解)
function clock(hour, minute, second) {
}
clock.prototype.hour = 12;
clock.prototype.minute = 12;
clock.prototype.second = 12;
clock.prototype.showTime = function() {
alert(this.hour + ":" + this.minute + ":" + this.second);
}
var newClock = new clock();
newClock.showTime();
当然可以这样写:
function clock(hour, minute, second) {
}
clock.prototype = {
constructor: clock,//必须手动设置这个属性,不然就断了与构造函数的联系了。没有实例共享原型的意义了。
hour: 12,
minute: 12,
second: 12,
showTime: function() {
alert(this.hour + ":" + this.minute + ":" + this.second)
}
}
var newClock = new clock();
newClock.showTime();
理解调用过程可以参考:JavaScript_原型和继承(2017-03-15)
JS中万物皆对象,但分为两大类:普通对象和函数对象。所有的函数对象都有一个prototype属性,普通对象是没有prototype属性的,只有_proto_
说明:
原型模式虽然解决了构造函数每个方法都会在每个实例中重新创建一遍的问题。但是所有实例在默认情况下都取得了相同的属性值,实例一般都是要有属于自己的全部属性的。
4.组合使用构造函数模式和原型模式(混合模式,推荐)
function clock(hour, minute, second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}
clock.prototype.showTime = function() {
alert(this.hour + ":" + this.minute + ":" + this.second);
}
var newClock = new clock(12, 12, 12);
newClock.showTime();
该模式是指混合搭配使用构造函数方式和原型方式
说明:
将所有属性不是方法的属性定义在函数中(构造函数方式,私有private)
将所有属性值为方法的属性利用prototype在函数之外定义(原型方式,共享public)
5.动态原型方式
function Parent() {
this.name = "李小龙";
this.age = 32;;
//方式1 通过函数对象有无此属性来决定
if (typeof Parent._lev == "undefined") {// 这段代码只执行了一次
Parent.prototype.lev = function() {
return this.name;
}
Parent._lev = true;
}
//方式2 通过实例对象根据原型链寻找有无此属性来决定
if (typeof this.lev != 'function') {// 这段代码只执行了一次
Parent.prototype.lev = function() {
return this.name;
}
}
};
var x = new Parent();
alert(x.lev());
动态原型方式可以理解为混合构造函数,原型方式的一个特例
说明:
该模式中,属性为方法的属性直接在函数中进行了定义,但是因为方式1,2的判定。从而保证创建该对象的实例时,属性的方法不会被重复创建
6 寄生构造函数模式(没理解,不先写)
7 稳妥构造函数模式(没理解,不先写)
copy:
JavaScript_几种创建对象(2017-07-04)的更多相关文章
- Javascript学习笔记:9种创建对象的方式
最基本的对象创建方式是通过Object构造函数或对象字面量的方式创建: ①通过Object构造函数的方式创建对象: var person=new Object();//或者写成var person={ ...
- js几种创建对象的方式
javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成 ...
- C#中几种创建对象的方式的对比
最近学习了msil,发现了很多好玩的,今天介绍一个用IL来创建对象的方式 1.最常见的两种创建对象方式 public static T Create<T>() where T : new( ...
- 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09
作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09 据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...
- 转 java中5种创建对象的方法
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- C#三种创建对象方法所需时间比较。。。。。
C#创建对象的三种方法 new().Activator.Assembly,接下来通过代码直接来看看运行的速度.... 首先,先看看三种创建对象实例的方法: //new(); public stati ...
- JS高级---三种创建对象的方式
JS高级---三种创建对象的方式 字面量的方式 (实例对象) 调用系统的构造函数 自定义构造函数方式 //创建对象---->实例化一个对象,的同时对属性进行初始化 var per=new Per ...
- javascript三种创建对象的方式
javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成 ...
- java四种创建对象的方法
1.用new语句创建对象,这是最常见的创建对象的方法. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance ...
随机推荐
- springboot系列七:springboot 集成 MyBatis、事物配置及使用、druid 数据源、druid 监控使用
一.MyBatis和druid简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.M ...
- 研究slatstack时踩过的坑,注意点及解决方案
运行问题 1.直接物理性移除minion或者更换minion原先连接的master,会导致先前的master始终无法ping通minion [root@localhost salt]# salt '* ...
- sum行列合计
select sum(decode(cplb,'3',hj,0)) from lr_scsjdqdw t group by zcxmdm
- nginx1.8.1反向代理、负载均衡功能的实现
nginx1.8.1 proxy 服务器192.168.8.40 web1 centos6.5 httpd2.2.15 web2 centos7.2 httpd2.4.6 1.代理功能的简单实现 ng ...
- App调试的几个命令实践【转】
在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面 ...
- Unicode范围预览
链接: https://www.zhangxinxu.com/study/201611/show-character-by-charcode.php?range=4E00-9FBB 备注: Unico ...
- 深入理解JS中的变量及变量作用域
JS的变量有两种,“全局变量”和“局部变量”. “全局变量”声明在函数外部,可供所有函数使用,(全局变量属于window)而“局部变量”声明在函数体内部,只能在定义该变量的函数体内使用. 1.全局变量 ...
- poj1177 矩形周长并
线段树扫描线的模板题,一个月前写的发现忘了一些还是要看看以前的博客呀! /* 思路:数据小不用离散化处理,线段树叶子结点维护一个区间 */ #include<iostream> #incl ...
- python 全栈开发,Day126(创业故事,软件部需求,内容采集,显示内容图文列表,MongoDB数据导入导出JSON)
作业讲解 下载代码: HBuilder APP和flask后端登录 链接:https://pan.baidu.com/s/1eBwd1sVXTNLdHwKRM2-ytg 密码:4pcw 如何打开APP ...
- Ext.js入门:面板(五)
一:Ext.Panel类简介 二:Ext.Panel类常用属性方法与事件 三:Ext.Panel实例运用 1.Ext.Panel类简介 类 Ext.Panel 包: Ext 定义的文件: ...