通过创建一个Object实例

 var person = new Object();
person.name = "zhouquan";
person.age = 21;
person.sayName = function(){
console.log(this.name);
}; person.sayName();//zhouquan

对象字面量方式

var person = {
name: "zhouquan",
age: 21,
sayName:function(){
console.log(this.name);
}
}; person.sayName();//zhouquan

通过普通的创建object实例的方式和对象字面量的方式创建对象的方式的缺点在于:这两种方式都不适合多次创建同一类型的对象。

工厂模式

 function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
console.log(this.name);
};
return o;
} var person1 = createPerson("zhouquan", 22, "student");
person1.sayName(); //zhouquan var person2 = createPerson("zhouquan2", 23, "Programer");
person2.sayName(); //zhouquan2

函数createPerson()能够根据接受的参数来构建一个包含所有必要信息的Person对象。可以无数次的调用这个函数,而每次都会返回一个包含数个属性的和一个方法的对象。工厂模式虽然解决的创建多个类似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。

构造函数模式

function Person(name, age){
this.name = name;
this.age = age;
this.sayName = function(){
console.log(this.name);
};
} var person1 = new Person("zhouquan", 21);
person1.sayName(); //zhouquan
var person2 = new Person("zhouquan2", 23);
person2.sayName(); //zhouquan2

用这种方式创建对象更工厂模式比起来具有以下几点区别:

  • 没有显示的创建对象
  • 直接将属性和方法赋给了this对象
  • 没有return语句

此外,还应该注意到函数名Person使用的大写字母P。这个是为了区别于其他的函数。

原型模式

function Person(){
}
Person.prototype.name = "zhouquan";
Person.prototype.age = 21;
Person.prototype.sayName = function(){
console.log(this.name);
}; var person1 = new Person();
person1.sayName();//zhouquan var person2 = new Person();
person2.sayName();//zhouquan

prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以有特定类型的所有实例共享的属性和方法。使用原型对象的好处也就是可以让所有的对象实例共享它所包含的属性和方法。

但是这种方法写起来还是不方便,需要在每一个属性或者方法前面书写Person.prototype,我可以结合前面的对象字面量的方法来进行改进:

function Person(){
}
Person.prototype={
name : "zhouquan",
age : 21,
sayName : function(){
console.log(this.name);
}
}; var person1 = new Person();
person1.sayName();//zhouquan var person2 = new Person();
person2.sayName();//zhouquan

组合使用构造函数模式和原型模式

function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype={
sayName : function(){
console.log(this.name);
}
}; var person1 = new Person("zhouquan", 21);
person1.sayName();//zhouquan var person2 = new Person("xiaozhou", 21);
person2.sayName();//xiaozhou

这种方式是创建自定义类型的最常见方式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。这样,每个实例都会有自己的一份实例属性的副本,但同时又共享这对方法的引用,最大限度地节省了内存。另外,这种组合模式还支持向构造函数传递参数。可以说,这是用来定义引用类型的一中默认模式。

动态原型模式

function Person(name, age){
this.name = name;
this.age = age;
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
console.log(this.name);
};
}
} var person1 = new Person("zhouquan", 21);
person1.sayName();//zhouquan var person2 = new Person("xiaozhou", 21);
person2.sayName();//xiaozhou

这里只在sayName()方法不存在的情况下,才会将它添加到原型中,if语句只在初次调用函数时才会执行。其中if语句检查的可以是初始化之后应该存在的任何属性或方法,不必用一大堆if语句检查每个属性和方法,只要检查一个即可。需要注意的是,使用动态原型模式时,不能使用对象字面量重写原型,因为如果在以及创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系。

javascript创建对象的一些方式的更多相关文章

  1. svg中实现文字随曲线走向,HTML直接写和JavaScript创建对象两种方式

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

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

    javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用.主要为下面几种:1.对象字面量的方式 person={firstname ...

  3. javascript 创建对象方式

    本文主要是对<JavaScript高级程序设计>第六章(面向对象的程序设计)的总结,书上的这章至少看了4遍是有的.该章主要讲对象的创建与继承.其中创建对象和继承方式至少6种,再加上一些方法 ...

  4. JavaScript创建对象的6种方式

    JavaScript创建对象简单的说,无非就是使用内置对象(Object)或各种自定义对象,当然还可以用JSON,但写法有很多种,也能混合使用. 1.对象字面量的方式 person = {name : ...

  5. JavaScript 创建对象的七种方式

    转自:xxxgitone.github.io/2017/06/10/JavaScript创建对象的七种方式/ JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以 ...

  6. JavaScript创建对象的几种 方式

    //JavaScript创建对象的七种方式 //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9 ...

  7. javascript创建对象的几种方式?

    javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. 1.对象字面量的方式 person={ firstname:" ...

  8. Javascript 创建对象方法的总结

    最近看了一下<Javascript高级程序设计(第三版)>,这本书很多人都推荐,我也再次郑重推荐一下.看过之后总得总结一下吧,于是我选了这么一个主题分享给大家. 使用Javascript创 ...

  9. JavaScript创建对象(三)——原型模式

    在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...

随机推荐

  1. MMORPG大型游戏设计与开发(服务器 游戏场景 事件)

    今天第星期天,知识是永远是学习不完的,所以今天这部分算比较轻松,同时也希望大家会有一个好的周末.场景事件即场景的回调,和别的事件一样是在特定的条件下产生的,前面也介绍过场景的各种事件,今天详细的说一说 ...

  2. Leetcode: climbing stairs

    July 28, 2015 Problem statement: You are climbing a stair case. It takes n steps to reach to the top ...

  3. es6学习笔记2-解构赋值

    解构赋值基本概论就按照一定的模式通过数组或者对象对一组变量进行赋值的过程. 1.通过数组对变量进行赋值: /*通过这种方式赋值要注意左右两边的结构模式要一样,在赋值的时候,根据位置进行赋值对应模式.* ...

  4. log4j.properties配置

    一.日志:除了能记录异常信息,还可以记录程序正常运行时的关键信息. 使用log4j来进行日志文件记录经典步骤: 01.在项目中创建一个lib文件夹,然后将下载好的jar包copy到该文件夹下 02.对 ...

  5. BIOS设置和CMOS设置的区别与联系

    BIOS是主板上的一块EPROM或EEPROM芯片,里面装有系统的重要信息和设置系统参数的设置程序(BIOS Setup程序): CMOS是主板上的一块可读写的RAM 芯片,里面装的是关于系统配置的具 ...

  6. php面向对象编程(一)

    类与对象关系: 类就像一个人类的群体 我们从类中实例化一个对象 就像是制定一个人. 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何来声明类, 做出来一个类很容易 ...

  7. UITableView的使用

    参考:IOS7.0 programming cookbook. http://www.cnblogs.com/kenshincui/p/3931948.html http://blog.csdn.ne ...

  8. linux 下载百度盘,迅雷离线文件,解压乱码文件的方法。

    首先,利用bypy的自动打包功能,将百度盘里的文件自动存放至app/bypy中,这样文件就是打包形式. 再利用 axel -n 10 "下载地址",将文件下载至本地. 下载地址获取 ...

  9. Size Balance Tree(SBT模板整理)

    /* * tree[x].left 表示以 x 为节点的左儿子 * tree[x].right 表示以 x 为节点的右儿子 * tree[x].size 表示以 x 为根的节点的个数(大小) */ s ...

  10. hdu5468 Puzzled Elena

    hdu5468 Puzzled Elena 题意 求一棵子树内与它互质的点个数 解法 容斥 我们先求出与它不互质的数的个数,再用总数减去就好. #include <cstdio> #inc ...