通过创建一个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. Sql server2012 常见异常处理

    网络相关 无法通过IP(127.0.0.1 或者其他本机)连接 确保TCP/IP功能开启 打开1433端口 权限相关 代理的权限,通过更改有最高权限的用户,或者给该用户指定的权限 给域用户开通SQLS ...

  2. WPF Freezable–How to improve your application's performances

    在给ImageBrush绑定动态图片是会报以下错误. Error    4    The provided DependencyObject is not a context for this Fre ...

  3. Zip加密

    http://www.cnblogs.com/kgdxpr/archive/2013/08/01/3230174.html

  4. flask+sqlite3+echarts3+ajax 异步数据加载

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  5. 基于xml的Spring多数据源配置和使用

    上一篇讲了<基于注解的Spring多数据源配置和使用>,通过在类或者方法上添加@DataSource注解就可以指定某个数据源.这种方式的优点是控制粒度细,也更灵活. 但是当有些时候项目分模 ...

  6. [[iso教程]] 《4个月ios实体教程》全网最新、最全ios视频教程

    全网最新.最全ios视频教程 内容简介 <ios实体教程>主要介绍如何使用iOS提供的强大工具集创建iOS应用.全视频对iOS操作系统做了全面的介绍,首先讲解如何构建应用程序的用户界面,涵 ...

  7. CentOS 6.5 PPTPD VPN服务器安装,解决807等问题。

    需要两个组件: ppp pptpd 需要配置的地方有三处: /etc/pptpd.conf /etc/ppp/options.pptpd /etc/ppp/chap-secrets 需要开启IP转发: ...

  8. E - Super Jumping! Jumping! Jumping!

    /* Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!" is very popula ...

  9. DB&SQL备忘

    DB2最佳分页语句 SELECT * FROM ( SELECT inner2_.*, ROWNUMBER() OVER(ORDER BY ORDER OF inner2_) AS rownumber ...

  10. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...