理解对象

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. phantomjs 下拉滚动条获取网页的全部源码

    //codes.js var system = require('system'); var fs = require("fs"); //console.log('Loading ...

  2. java并发编程系列四、AQS-AbstractQueuedSynchronizer

    什么是AbstractQueuedSynchronizer?为什么我们要分析它?  AQS:抽象队列同步器,原理是:当多个线程去获取锁的时候,如果获取锁失败了,当前线程就会被打包成一个node节点放入 ...

  3. 【转】new对象时,类名后加括号和不加括号的区别

    请看测试代码: #include <iostream> using namespace std; // 空类 class empty { }; // 一个默认构造函数,一个自定义构造函数 ...

  4. string.intern

    在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String.intern()返回引用的测试. 总结一句话: jdk1.7之前,调用intern()方法会判断常量池是否有该字符串, ...

  5. [PHP] 链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...

  6. pytest一:pytest 框架介绍

    pytest 是 python 的一种单元测试框架,与python 自带的 unittest测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高.根据pytest 的官方网站介绍,它具 ...

  7. python+selenium五:多窗口切换与获取句柄

    from selenium import webdriverfrom selenium.webdriver.common.by import Byimport time driver = webdri ...

  8. 《剑指offer》-表示数值的字符串

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416&q ...

  9. SqlServr分页存储过程的写法

    CREATE PROCEDURE [dbo].[GetDataByPager] ( --从第几条数据取 @startIndex INT, --分页的表 @tableName VARCHAR(50), ...

  10. STL算法之函数copy

    STL算法之copy copy(beg, end, dest) #include <iostream> #include <algorithm> #include <ve ...