理解对象

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. notepad++64位添加plugin manager

    - 64位的notepad++,下载下来似乎没有plugin manager,如果真没有可以下载plugin manager. - plugin manager的下载地址:https://github ...

  2. 提高delete效率方法

    1 open c_1;   loop     fetch c_1 bulk collect       into t2 limit 100000;     exit when c_1%notfound ...

  3. Java中的BlockingQueue队列

    BlockingQueue位于JDK5新增的concurrent包中,它很好地解决了多线程中,如何高效安全地“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极 ...

  4. 解析神奇的 Object.defineProperty

    这个方法了不起啊..vue.js是通过它实现双向绑定的..而且Object.observe也被草案发起人撤回了..所以defineProperty更有必要了解一下了. 几行代码看他怎么用 var a= ...

  5. SQL聚合函数

  6. mysql的undo log和redo log

    在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件.     MySQL中的日志文件,有这么两 ...

  7. ctype

    original:http://www.runoob.com/cprogramming/c-standard-library-ctype-h.html 下面列出了头文件 ctype.h 中定义的函数: ...

  8. 性能测试三十九:Jprofiler分析CPU过高和响应时间长的问题

    使用Jprofiler监控分析案例 一.cpu负载过高:http://localhost:8080/PerfTeach/CpuTopServlet?id=1 cpu消耗高的可能原因1.使用了复杂的算法 ...

  9. Python3-RabbitMQ 3.7.2学习——Hello World(二)

    RabbitMQ环境搭建好了,接下来就是学习编程的入门级hello world. 在运行程序前,要先确保开启RabbitMQ服务 然后安装pika,命令:pip install pika 1.创建一个 ...

  10. 192 Word Frequency

    Write a bash script to calculate the frequency of each word in a text file words.txt. For simplicity ...