由于javascript没有java那么多基本类型,同时也没有提供class这个东西,那么我们想实现javascript的对象创建应该怎么办呢,我简单地从w3c提供的课件中提取了一下几种方法:

一.工厂模式

  说白了就是类似于c语言中的定义一个函数,然后给一个struct的各个属性复制,再返回这个struct。代码示例:

    function person(name,age,sex){

      var o=new Object();

      o.name=name;

      o.age=age;

      o.sex=sex;

      o.sayName=function(){

        alert(this.name);

      }

      return o;

    }

    var person1=new person("wangke",21,"Male");

    var person2=new person("gaoyuanyuan",34,"Female");

    person1.sayName();//wangke

    person2.sayName();//gaoyuanyuan

这种办法的确可以创建多个类似的对象,但是个人觉得类似c++中struct与class的区别,它没有解决对象的识别问题。

二.构造函数模式:

  其实在javascript中,构造函数和普通函数没什么区别,起码从格式上看来都是一样的,所谓的构造函数无非就是在调用的时候前面加了个new,比如上节的var person1=new person(...)。在这种模式中,通过使用this,将属性和方法赋值给this对象,这样就不用return了,同时一般构造函数的首字母会大写的(这也算是个认为加上去的区别吧)。示例代码:

  function Person(name,age,sex){

    this.name=name;

    this.age=age;

    this.sex=sex;

    this.sayName=function(){...};

  }

  var person1=new Person("wangke",21,"Male");

  var person2=new Person("gaoyuanyuan",34,"Female");

这种模式就可以进行类型检测了,通常用instanceof方法:

  alert(person1 instanceof Object);//true

  alert(person1 instanceof Person);//true

缺陷:每次实例化一个对象,里面的方法都会被重新创建一遍,浪费资源,所以我们可以想着把它放到全局变量中(但是只被个别方法调用,作用域为全局显得名不副实)。修改如下:

  

 function Person(name,age,sex){

    this.name=name;

    this.age=age;

    this.sex=sex;

    this.sayName=sayName;

  }

  function sayName(){

    alert(this.name);

  }

使用这种方法的话,会出现太多的全局函数了,所以我们会在下一种这种方法中解决这个问题。

三.原型模式:

  了解什么是prototype(原型):w3c给的概念有点绕,我通俗点说:prototype就是“一个给类的对象添加方法的方法”,假如有你把一个对象a赋值为一个对象b,假如对对象a进行拓展的话,那么对象b也能访问a新定义的属性或方法。可能这两句话还是不能理解,那就看代码以及w3c上提供的图(看了图就会恍然大悟了)。

  function Person(){

  }

  Person.prototype={

    name:"Nicholas",

    age:29,

    job:"Soft Engineer",

    sayName:function(){

      alert(this.name);

    }

  };

  var person1=new Person();

  var person2=new Person();

  alert(person1.sayName==person2.sayName();//true

备注:1.原型的动态性(开头也提到过,对a的拓展)即可以先创建实例再修改原型也可以:

  var person=new Person();

  Person.prototype.saySth(){

    alert("i want to sleep");

  };

  person.saySth();//i want to sleep

虽然修改可以立即在所有对象实例中反映过来,但是要重写所有的原型对象就会不一样了。

2.原生对象的原型--不光自定义类型方面原型很重要,所有原生的引用类型都是采用这种模式创建的,所以我们可以自己添加一些方法:

  String.prototype.startWith=function(text){

    return this.indexof(text)==0;

  };

  var msg="Hello,World";

  alert(msg.startWith("Hello");//true

3.原型模式的缺陷:共享的本性,特别是array。

  function Person(){

  }

  Person.prototype={

    name:"Nicholas",

    age:29,

    job:"Soft Engineer",

    friends:["wangke","yuanyuan"],

    sayName:function(){

      alert(this.name);

    }

  }

  var person1=new Person();

  var person2=new Person();

  person1.friends.push("xijinping");

  alert(person1.friends);//wangke,yuanyuan,xijinping

  alert(person2.friends);//wangke,yuanyuan,xijinping

四.组合

  现在只要解决了原型模式中共享造成的缺陷,那么就比较完美了,我们注意到第二条的构造函数模式了吗?下面就是最常见的创建自定义类型的方式:

  function Person(name,age,sex){

    this.name=name;

    this.age=age;

    this.sex=sex;

    this.friends=["obama","kobe"];

  }

  Person.prototype={

    constructor:Person,

    sayName:function(){}

  }

实例属性都是在构造函数中定义,而共享的属性和方法都是在原型模式中定义。

五.其他构造方式:

  偶尔会用到,大家可以自己查一下:动态原型模式,寄生构造方式 ,稳妥构造函数模式

以上只是个人的一点总结,欢迎大家阅读并交流!

javascript对象的创建--相对java 怎样去创建了"类"i以及实例化对象的更多相关文章

  1. 依赖注入之setter注入---只需修改配置,电脑就可以安装不同的打印机;读取properties配置文件并创建实例;实现不采用new的方式直接实例化对象

    1.项目截图 2.黑白打印机类 package com.example.demo.printer; public class GrayPrinter implements Printer{ @Over ...

  2. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  3. Java实例化对象过程中的内存分配

    Java实例化对象过程中的内存分配: https://blog.csdn.net/qq_36934826/article/details/82685791 问题引入这里先定义一个很不标准的“书”类,这 ...

  4. 数据库连接工具类 数据库连接工具类——仅仅获得连接对象 ConnDB.java

    package com.util; import java.sql.Connection; import java.sql.DriverManager; /** * 数据库连接工具类——仅仅获得连接对 ...

  5. Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式

    1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...

  6. 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性

    大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...

  7. 转:【深入Java虚拟机】之三:类初始化

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17845821 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Jav ...

  8. 【深入Java虚拟机】之三:类初始化

    类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码.虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new.getstatic.putstatic ...

  9. 2016/3/21 面向对象: ①定义类 ②实例化对象 ③$this关键字 ④构造函数 ⑤析构函数 ⑥封装 ⑦继承

    一:定义类   二:实例化对象 //定义类 class Ren { var $name; var $sex; var $age; function Say() { echo "{$this- ...

随机推荐

  1. cal日历工具的用法

    cal的基本语法:$ cal [month] [year] 1.显示当前月的日历 $ cal 2.显示某年的日历 $ cal 2015 3.显示某年某月日历 $ cal 12 2015 =-=-=-= ...

  2. [1] [转]软件架构之三层架构和MVC的关系

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联 ...

  3. drozer使用

    1.启用adb 端口转发 adb forward tcp:314154 tcp:31415 2.启用drozer 3.链接drozer drozer console connect     4:如果没 ...

  4. Java学习笔记--异常描述

    异常描述 1.简介 为了全面了解"异常"的概念,先来分析一个实例.假定要编写一个Java程序,该程序读取用户输入的一行文本,并在终端显示该文本.这里是一个演示Java语言I/O功能 ...

  5. 基于TFS的.net技术路线的云平台DevOps实践

    DevOps是近几年非常流行的系统研发管理模式,很多公司都或多或少在践行DevOps.那么,今天就说说特来电云平台在DevOps方面的实践吧. 说DevOps,不得不说DevOps的具体含义.那么,D ...

  6. 基于 HTML5 WebGL 的 3D 网络拓扑图

    在数据量很大的2D 场景下,要找到具体的模型比较困难,并且只能显示出模型的的某一部分,显示也不够直观,这种时候能快速搭建出 3D 场景就有很大需求了.但是搭建 3D 应用场景又依赖于通过 3ds Ma ...

  7. laravel blade模板介绍

    第一步:首先写好模板 在sites下新建立一个app.blade.php文件 写入模板如: <!DOCTYPT html><html><head> <titl ...

  8. 关于一点jeesite

    最近刚接触jeesite 深深被这个功能强大的框架所折服,虽然其中有一些地方还不完善,但也不妨碍我们通过jeesite提高我们java水平的大门. 这两天在网上一直在找关于jeesite的文章,看来看 ...

  9. jquery.validata.js 插件2

    结合上面的,今天写一下validate的使用方法. validate()验证所选的form. validate 方法返回一个 Validator 对象.Validator 对象有很多方法可以用来引发校 ...

  10. 将notepad++打造成java快速开发IDE

    参考文章:http://blog.csdn.net/mdyyzc/article/details/7653096 有时候要试验一小段代码,打开eclipse又需要忍受漫长的煎熬(电脑配置较低,见谅). ...