javascript如何创建对象


Posted in Javascript onAugust 29, 2016

JS是基于对象的语言,可以使用面向对象思想模拟JAVA|C++之类的面向对象语言。
 •面向过程
◦关注解决问题的步骤

 •面向对象
◦关注的是解决问题的所需要的对象(内容和角色),然后根据业务逻辑按一定规则调用相关方法

对象分为系统对象和自定义对象两种。我们可以通过调用系统构造函数来创建出系统对象,如:array|date等。自定义对象必须自己创造,无法利用系统函数来创造。

javascript创建对象 

一、直接创建

//直接创建
     //JS创建对象
     //1:创建空对象
         var person1 = new Object();
     //2:将该对象所需要的属性、方法加进去
         person1.name ="ailer" ;
         console .log(person1.name);
         person1.gender = "male";
     //3:该对象添加的方法|(函数)
         person1. manager= function (){
           console .log("Ailer is my English name" );
        }
     //4:调用对象方法:对象.方法名();
         person1.manager();

     //函数|方法?函数属于对象时,该函数属于这个对象下的方法;通过方法名来调用该函数;
     //变量|属性 ?当变量属于某一个对象时候, 该变量就是这个对象下的方法。通过属性名来调用变量。

      //增
         person1.age ="6" ;
      //改
         person1.name ="lemon" ;
      //查
         console .log(person1.name);
     //删
         delete person1.age;
         console .log(person1.age);==> undefined

      //引用类型,存储的是地址
      //基本类型:存储的是值 标志位

     /*  var arr1 = [1,2,3,4]
        var arr2 = [5, 6, 7,9];
        var arr2 = arr1;//
        arr2[0]=10;//更改arr2里面的值,arr1也更改
        alert(arr1[0]);//====>10 引用类型*/

        var per2 = new Object();
        per2.name = "Relia";
        per2.age = "18";
        per2.gender = "femal";
        per2.hobby = "lemons";

         //1:通过.(点语法)访问属性
         //2:通过[](方括号)访问对象的属性;方括号中必须是属性字符串或保存属性字符串的变量|遍历属性的时候才使用方括号
         var n = "name"
         //console.log(per2["name"]);//双引号

         console .log(per2[n]);
         for ( var property in per2) {
//          console.log(per2[property]);
         }

虽然直观,但是创建多个对象的时候,代码冗余

二、使用函数创建(工厂模式)

为了解决多个类似对象声明的问题,我们可以使用一种叫做工厂模式的方法,这种方法就是为了解决实例化对象产生大量重复的问题。

//定义构造函数      
 function createPerson ( name, age) {
//创建一个新的空对象
           var person = new Object;
//添加属性|方法
           person.name = name;
           person.age = age;
           person. manager = function() {
              console .log("ai" );
           }
//返回
           return person;
        }

         var per1 = createPerson( "ailer", 12 );
         console .log(per1.name);

        var per2 = createPerson( "lemon", 23 );
        console .log(per2.age);
        console.log(per2 instanceof Object);//true
        console.log(per2 instanceof createPerson);//false//无法区分该对象类型
        console.log(per2.manager==per1.manager);//false 可得出per1和per2各自开闭空间

优:批量创建同类实例
缺:实例用同类属性, 造成内存浪费无法公,且无法区分该对象的类型

三、 字面量创建

优:简单直接
缺:无法批量构建同类对象

//字面量创建的对象使用constructor属性不会指向实例,而是指向object
 //使用字面量创建
       var per1 = {
        name:"Ailer",
         constructor:per1,
        age:12,
        gender:"female",
        hobby:"play",
        eat:function(){
          console.log(this.name);
        }
       }
       per1.eat();//ailer
       per1.name="lemon";
       per1.eat();//lemon
       console.log(typeof per1);//Object
       console.log(per1.constructor==Object);//true

 四、new+构造函数

//构造函数创建对象,其子对象用instanceof不识别,所有采用new+obj创建
        //对象识别了,但是仍然浪费一些代码区;==>产生原型创建
        //创建js对象 new+构造函数
        //1:创建构造函数 |通常首字母大写
        function CreatePerson( name , age){
          //2:把对象的属性|方法挂靠在this指针身上, 当调用该函数创建对象时,this指针就指向这个新对象;
          //这个this就添加给这个对象
          this.name = name;
          this.age = age;
          /*this.speak = function(){
            //此处this也指向创建对象
            console.log(this.name+" hello");
          }
        }

      /* CreatePerson.prototype.gender = "20";
       CreatePerson.prototype. ea = function(){
          console .log(this.name+ "sfd" );
       }*/

//      __proto__:是:实例对象中的原型属性, 指向对应构造函数对应的原型对象
//      [[prototype]]
        //调用
        var per1 = new CreatePerson( "ailer", "20" );
        var per2 = new CreatePerson( "relia", "18" );
        console .log(per1 instanceof CreatePerson); //==true
        console .log(per2 instanceof CreatePerson); //==>true
        console .log(per1.speak== per2.speak); //==false说明系统开辟了两个不同的代码区,造成了内存浪费.

字面量创建一个比较方便,所以产生构造函数,普通构造函数(工厂模式),子对象instanceof不识别且内存浪费,用new+构造函数,子对象识别了,但仍有部分代码重复,内存浪费,产生原型代码解决。

五、原型模式

function CreateAnimal(name, age) {
        //1.2:把外部参数绑定实例属性
        this.name = name;
        this.age = age;
      }
      //1.3把相同的属性,绑定在原型上(原型属性,原型方法)
      CreateAnimal.prototype.gender = "male";
      CreateAnimal.prototype.style = function() {
        console.log(this.name + " ailers");
      };
      //2:调用构造函数创建对象
      var cat1 = new CreateAnimal("xiaohua", "2");
      var cat2 = new CreateAnimal("xiaohua", "2");
      cat1.style();

      console.log(cat1.style==cat2.style);//方法引用地址一样,将属性放到原型对象中,节约地址

      //instanceof可以来判断对象属于哪一个【函数】
      //constructor 建造者 也可以用来判断对象属于哪个【构造函数】 【常】 
      //实例对象保存一个 constructor属性指向它的构造函数
      //instanceof and constructor 区别
      console.log(cat1 instanceof CreateAnimal);//true
      console.log(cat1 instanceof Object);//true

      console.log(cat1.constructor == CreateAnimal);//true
      console.log(cat1.constructor == Object); //==false

      //构造函数的原型也有constructor属性指会构造函数
      console.log(CreateAnimal.prototype.constructor == CreateAnimal);//true

      //in判断该属性是否存在这个对象中,这个属性为实例属性或原型 
//           alert("name" in cat1)//true
//           alert("gender" in cat1);//true

      //hasOwnProperty:来判断某一个属性到底是实例属性,还是继承自原型属性 if 是 为true, else不存在|不是返回false;
      console.log(cat1.hasOwnProperty("aaa"));//false 不存在的属性返回为false
      console.log(cat1.hasOwnProperty("name"));//true 实例属性
      console.log(cat1.hasOwnProperty("style"));//false 原型属性返回为false

      //遍历属性找原型属性

      //判断参数是否为原型属性  工具类
      console.log(isPrototype("gender", cat1));//true
      function isPrototype(proString, obj) {
        if(proString in obj) {
          if(!obj.hasOwnProperty(proString)) {
            return true;
          } else {
            return false;
          }
        } else {
          return false;
        }
      }
      /*
function isProperty(object, property) {//判断原型中是否存在属性
 return !object.hasOwnProperty(property) && (property in object);
}*/

动态原型模式

//构造函数中初始化原型
function per(name, age, gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        //只在初始化原型的时候执行一次
        if(typeof this.sayName != "function") {
          Person.prototype.sayName = function() {
            alert(this.name);
          }
        }
      }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
超级退弹代码
Jul 07 Javascript
JavaScript中的isXX系列是否继续使用的分析
Apr 16 Javascript
setTimeout自动触发一个js的方法
Jan 15 Javascript
json字符串之间的相互转换示例代码
Aug 21 Javascript
用jquery修复在iframe下的页面锚点失效问题
Aug 22 Javascript
js实现单击图片放大图片的方法
Feb 17 Javascript
Jquery日历插件制作简单日历
Oct 28 Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
Oct 30 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
Jun 25 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
Sep 12 Javascript
javascript实现雪花飘落效果
Aug 19 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
Aug 29 #Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
Aug 29 #Javascript
学习掌握JavaScript中this的使用技巧
Aug 29 #Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
Aug 29 #Javascript
浅谈jQuery为哪般去掉了浏览器检测
Aug 29 #Javascript
jQuery为动态生成的select元素添加事件的方法
Aug 29 #Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 #Javascript
You might like
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
XENON基于JSON变种
2010/07/27 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Python的print用法示例
2014/02/11 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
django 外键model的互相读取方法
2018/12/15 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python 实现识别图片上的数字
2019/07/30 Python
python梯度下降算法的实现
2020/02/24 Python
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
机电工程学生自荐信范文
2013/12/07 职场文书
《都江堰》教学反思
2014/02/07 职场文书
中学政教处工作总结
2015/08/13 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
Win11软件图标固定到任务栏
2022/04/19 数码科技
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL