通过创建一个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. MySQL Database on Azure新功能

    本月中国版的MySQL Database on Azure发布了两项新功能: 1.主从复制——只读实例 在这之前Azure上的MySQL数据库也是支持主从复制的,但是只能作为on-premises部署 ...

  2. PhotoShop算法原理解析系列 - 风格化---》查找边缘。

    之所以不写系列文章一.系列文章二这样的标题,是因为我不知道我能坚持多久.我知道我对事情的表达能力和语言的丰富性方面的天赋不高.而一段代码需要我去用心的把他从基本原理-->初步实现-->优化 ...

  3. 重新走过HTML,那些让我amazing 的标签

    这一次我用了短暂的时间重新梳理了html的标签(包括html5 新增),发现我以前忽略了很多又轻巧又精美且实用的标签,总结如下: 格式标签: <address> 标签: 定义文档或文章的作 ...

  4. 第4章 Java接收用户输入

    第4章 Java接收用户输入 1.输入 使用Scanner工具类可以换取用户输入的数据Scanner类位于java.util包中,使用时需要导入此包使用步骤: 1.导入java.util.Scanne ...

  5. IEnumerable,IQueryable之前世今生

    来自于:http://www.cnblogs.com/chengxiaohui/articles/2088967.html IEnumerable<T>在.Net2.0中我们已经很熟悉了. ...

  6. TCP/IP协议中网关和子网掩码概念

    网关: 不同网段的IP是不能直接互通的,需要一个设备来转发,这个设备就是网关,一般就是路由器,那么路由器的地址就是网关地址. 比如192.168.2.31要往192.168.3.31发送一条消息,他们 ...

  7. angularjs + fis +modJS 对于支持amd规范的组建处理(PhotoSwipe 支持,百度webUpload支持)

    这不是很好的处理方式,但是能够解决问题,希望有大神推荐更好的方式. 前端模块使用angularjs + fis +modJS 开发前端应用有两个月了.总结了以下的优点: fis 自动构建,自动发布,功 ...

  8. 【JavaScript】Html form 提交表单方式

    源:http://blog.csdn.net/wang02011/article/details/6299517 1.input[type='submit'] 2.input[type='image' ...

  9. linux dd 命令详解

    dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 ...

  10. Eclipse+Maven创建webapp项目<一>(转)

    还在为jar下载而烦恼吗?还在为jar依赖关系而烦恼吗?还在为jar冲突而烦恼吗?强大的maven项目管理工具来拯救你们呢?自动下载jar,自动下载jar依赖包.你什么都不用做,只需要在中央仓库中co ...