理解对象

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:

  js面向对象,多种创建对象方法!

  JS创建对象的几种方式

  

JavaScript_几种创建对象(2017-07-04)的更多相关文章

  1. Javascript学习笔记:9种创建对象的方式

    最基本的对象创建方式是通过Object构造函数或对象字面量的方式创建: ①通过Object构造函数的方式创建对象: var person=new Object();//或者写成var person={ ...

  2. js几种创建对象的方式

    javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成 ...

  3. C#中几种创建对象的方式的对比

    最近学习了msil,发现了很多好玩的,今天介绍一个用IL来创建对象的方式 1.最常见的两种创建对象方式 public static T Create<T>() where T : new( ...

  4. 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

    作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09     据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...

  5. 转 java中5种创建对象的方法

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  6. C#三种创建对象方法所需时间比较。。。。。

    C#创建对象的三种方法  new().Activator.Assembly,接下来通过代码直接来看看运行的速度.... 首先,先看看三种创建对象实例的方法: //new(); public stati ...

  7. JS高级---三种创建对象的方式

    JS高级---三种创建对象的方式 字面量的方式 (实例对象) 调用系统的构造函数 自定义构造函数方式 //创建对象---->实例化一个对象,的同时对属性进行初始化 var per=new Per ...

  8. javascript三种创建对象的方式

    javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成 ...

  9. java四种创建对象的方法

    1.用new语句创建对象,这是最常见的创建对象的方法.   2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance ...

随机推荐

  1. class_create(),device_create自动创建设备文件结点【转】

    本文参考来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhenwenxian/archive/2010/03/28/5424434.aspx 本文转自:http://ww ...

  2. 【实践】Matlab2016a的mdce集群搭建

    Matlab R2016a的mdce集群搭建 1.解压文件Matlab_R2016b_win64.iso. 文件下载地址:链接:https://pan.baidu.com/s/1mjJOaHa 密码: ...

  3. 【转】Source Insight中文注释为乱码的解决办法

    我网上查了一堆解决办法,但是都是2017年以前的,并且都是针对于source insight 3.5及以下版本的解决方案,软件版本都到4.0了,应该有新方法出现. 干货:Source Insight ...

  4. java中集合的组成及特点

    1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...

  5. plsql developer如何自定义快捷键

    首选项 用户界面 编辑器 自动替换 选择替换文件,文件内容: sf=select * from df=delete from

  6. Android Studio安装apk失败

    可能的情况 手机上已经安装了应用或者应用卸载不彻底 解决办法: adb uninstall yourpackagename 如果uninstall失败,可以考虑 clean一下Android Stud ...

  7. 读SRE Google运维解密有感(三)

    前言 这是读“SRE Google运维解密”有感第三篇,之前的文章可访问www.addops.cn来查看.我们今天来聊聊“on call”也就是运维值班制度, 本人到目前为止也还在参与一线运维的值班, ...

  8. HTTP SIP 认证

    HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate   HTTP认证  基于  质询  /回应(  challenge/response)的认证模式. ...

  9. abstract class 和 interface 区别

    本文出自与:heipai:tsg666 含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象.含有 abstract 方法的类必须定义为 abstract ...

  10. SeaJS入门教程系列之SeaJS介绍(一)

    前言SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,SeaJS不会扩展封装 ...