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 ...
随机推荐
- html5学习第一天
1.语义标签解决方案 <video></video> 属性: controls 显示控制栏 autoplay 自动播放 loop 设置循环播放 多媒体标签在网页中的兼容效果方 ...
- oracle 回退表空间清理
1.查看已有表空间,找到回退表空间 SELECT * FROM DBA_TABLESPACES WHERE CONTENTS='UNDO' 2.创建新的回退表空间 create undo tables ...
- 编译安装lamp环境
httpd 2.4.9 + mysql-5.5.33 + php-5.4.29编译安装过程: 准备好以下安装包: mysql-5.5.33-linux2.6-x86_64.tar.gz apr-uti ...
- Hibernate 常用jar包 分析
antlr-2.7.6.jar的作用 ANTLR (ANother Tool for Language Recognition) 是一个PCCTS制定的语言工具,它为他创建认定者,程序编译者,翻译者提 ...
- python之类中的super函数
作用 实现代码重用 思考:super真的只是调用父类么? super函数是按照mro算法去调用的,不bb上代码: class A: def __init__(self): print('A') cla ...
- HDU2873 Bomb Game(二维SG函数)
Bomb Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ERP合同审核流程处理(二十九)
合同审批流程: 前端的代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...
- win7 64 下 VS2008 调试、退出时错误的解决
最近调试老程序的时候发现原来的VS2008会偶尔在调试C++程序的时候出现程序未响应的情况,开始还以为是个案,后来出现的频率越来越高完全影响心情啊!! 准备花时间解决一下这个问题.网上搜索没有发现任何 ...
- java / android int类型如何判空?
/** TextUtils.isEmpty() 方法的实现 * Returns true if the string is null or 0-length. * @param str the str ...
- php 发送超大数据处理
set_time_limit(0);//设置永不超时 ignore_user_abort(); //设置客户端断开,继续处理 //总数 $allusercount= $this->gamedb_ ...