一、使用工厂方法创建对象

  • 减少代码的数量,提高代码的利用率
  • 可以大量的创建对象
  • 缺点:使用工厂方法创建的对象都是Object,对于不同对象不能进行区分
function createPerson(name,age,gender){var obj=new Object();obj.name=name;obj.age=age;obj.gender=gender;return obj;
}
var obj=createPerson("小明",12,"男");
console.log(typeof obj); //Object
console.log(obj); //{"name":"小明","age":12,"gender":"男"}

问题引入:对于不同对象不能进行区分

//人
function createPerson(name,age,gender){var obj=new Object();obj.name=name;obj.age=age;obj.gender=gender;return obj;
}
//狗
function createDog(name,age,gender){var obj=new Object();obj.name=name;obj.age=age;obj.gender=gender;return obj;
}
var person=createPerson("小明",12,"男");
var dog=createPerson("旺财",3,"男");
console.log(typeof person); //object
console.log(typeof dog); //object

二、构造函数(需要使用到this的部分知识点,不懂点击这里)

function Person(){console.log("person");/*构造函数的执行流程*(1)立即创建一个对象*(2)将创建的对象设置为函数中的this*(3)逐行执行函数代码*(4)将创建的对象作为返回值返回*/
}
var per=new Person(); //person
console.log(typeof per); //object//创建对象
function Person(name,age,gender){this.name=name;this.age=age;this.gender=gender;
}
var per=new Person("小明",12,"男");
console.log(per.name); //小明
console.log(per instanceof Person); // true 判断per是否是Person的一个实例对象//此时如果在创建一个对象为Dog,进行比较
function Dog(){}
var dog=new Dog();
console.log(dog ==per);//false
console.log(per instanceof Dog); //false
console.log(per instanceof Object); //true

三、构造函数(升级版)原型对象

问题引入:

  function Person(name,age,gender){this.name=name;this.age=age;this.gender=gender;this.sayName:function(){console.log("当前对象名字"+this.name);}
}
var per=new Person("小明",12,"男");

如果说有1000个对象,就得创建1000个sayName方法(方法的内存堆地址是不一样的,具体理由点击这里)。而且1000个方法的形式都类似,降低了代码的利用率,还会造成堆空间的浪费
      此时有一种方法就是将方法设置为全局下

function fun(){console.log("当前对象名字"+this.name);}function Person(name,age,gender){this.name=name;this.age=age;this.gender=gender;this.sayName:fun
}
var per=new Person("小明",12,"男");

但这样也不行,会污染全局环境。一旦不小心就会将该函数进行覆盖
      此时就引入了一个概念叫原型对象这个概念

什么是原型对象
  • 我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
  • 这个属性对应着一个对象,这个对象就是我们的原型对象
  • 如果函数作为普通函数调用prototype没有任何作用
  • 当函数以构造函数的形式调用时,所创建的对象中都会有一个隐含属性,指向该构造函数的原型对象
  • 原型对象相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象
function Person(){}
function fun(){}
console.log(Person.prototype); //person
console.log(fun.prototype); //fun
console.log(fun.prototype ==Person.prototype); //false
//function Person(){}
var per =new Person(); //隐含属性,指向该构造函数的原型对象
var per1=new Person();
console.log(per.__proto__); //person
console.log(per1.__proto__); //person
console.log(Person.prototype ==per.__proto__); //true 指向同一对象
console.log(per1.__proto__ ==per.__proto__); //true 指向同一对象

解决方法:在原型对象上添加一个方法

Person.prototype.sayName=function(){console.log("当前对象名字"+this.name);
}
var per=new Person("小明",12,"男");
per.sayName(); //sayName没有在实例对象上
  • 属性sayName是在原型对象上的,不在Person类上
  • 如果在该实例化对象上找不到该对象属性,则会在原型对象上找该属性。
  • 在该实例化对象上找到该对象属性,则直接使用。
  • 在原型对象找不到,则向原型对象的原型上找,直到找到object对象的原型
  • 在object对象的原型找不到,则返回undefined

判断一个属性是否存在在一个对象

//name当前属性是存放在原型上
console.log(name in per); //true//检查属于自己的属性
per.hasOwnProperty("name"); //false

欢迎访问我的个人博客

Javascript基础知识笔记四相关推荐

  1. JavaScript基础知识笔记

    基础语法 /* 多行注释 JS注释 多行注释,注释中的内容不会被执行,但是可以在源代码中查看 要养成良好的编写注释的习惯,也可以通过注释来对代码进行一些简单的调试 *///单行注释 //alert(& ...

  2. javascript基础知识笔记整理——javaweb笔记

    1.JavaScript 介绍 Javascript 语言诞生主要是完成页面的数据验证.因此它运行在客户端,需要运行浏览器来解析执行 JavaScript 代码. JS是Netscape网景公司的产品 ...

  3. javaSE基础知识笔记(四)

    多态--面向对象三大特征之三 同类型的对象,执行同一个行为,会表现出不同的行为特征 1 多态的常见形式 父类(或接口)类型new子类对象 父类类型 对象名称 = new 子类构造器;接口 对象名称 = ...

  4. Jquery源码中的Javascript基础知识(四)— jQuery.fn.init方法

    $() 即调用了jQuery.fn.init方法 jQuery = function( selector, context ) {return new jQuery.fn.init( selector ...

  5. HTML5学习笔记 —— JavaScript基础知识

    HTML5学习笔记 -- JavaScript基础知识 标签: html5javascriptweb前端 2017-05-11 21:51 883人阅读 评论(0) 收藏 举报 分类: JavaScr ...

  6. JS学习笔记二——JavaScript 基础知识

    JavaScript 基础知识 一.JavaScript 变量 二.JavaScript 的输出 三.JavaScript 运算符 四.结语 一.JavaScript 变量 变量是指在程序运行过程中, ...

  7. access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化

    往期回顾 医学科研实验基础知识笔记(一):细胞增殖 医学科研实验基础知识笔记(二):细胞凋亡检测 医学科研实验基础知识笔记(三):细胞周期检测 医学科研实验基础知识笔记(四):细胞自噬研究策略 医学科 ...

  8. JavaScript 基础知识 - DOM篇(二)

    7. 节点操作 7.1 节点的属性 节点分类: 标签节点 文本节点 属性节点 注释节点 节点常用的属性: nodeType:节点的类型 nodeName:节点名称 nodeValue:节点值 常见的节 ...

  9. Javascript基础知识之四(常用数组方法)

    一.MDN链接 Array - JavaScript | MDNJavaScript的 Array 对象是用于构造数组的全局对象,数组是类似于列表的高阶对象.https://developer.moz ...

  10. JavaScript基础知识与脚本语言总结

    1 Aptana插件安装 1.Aptana插件安装 <1>Aptana是一个非常强大,开源,JavaScript-focused的AJAX开发IDE. <2>它的特点包括: J ...

最新文章

  1. 【流媒體】jrtplib—VS2010下RTP开源协议库JRTPLIB3.9.1编译
  2. IOS-webService
  3. linux服务器重启后阵列卡分区没了,服务器数据丢失了怎么恢复/分区丢失恢复教程...
  4. Java面试题 synchronized底层实现原理?它与lock相比有什么优缺点?
  5. 计算机网络应用基础论文,计算机网络应用基础概述论文
  6. QML笔记-QML中SpriteSequence及Sprite的基本使用
  7. GitLab CI简单示例
  8. ajax如何传两个不同的参数,ajax 如何从后台传多个data对象(多个参数)string类型的...
  9. python手写计算器
  10. 基于公众号扫码授权登录
  11. 快速实现Thread Mesh组网详解
  12. RE|Nginx-安装与配置(1)
  13. 帝国CMS 批量修改信息标题方法
  14. 软件开发项目为什么要做第三方软件测试,软件测评机构怎么选择?
  15. 注意力机制详解(Attention详解)
  16. C++中的swap函数
  17. fpu测试_正点原子STM32F4/F7水星开发板资料连载第五十章 FPU 测试实验
  18. nginx代理图片和视频
  19. 深度学习简介--PPT
  20. 马哥:一个38岁北漂大龄在线教育创业者维权的痛与谢

热门文章

  1. allwinner h6 armv8 SylixOS 启动分析
  2. linux驱动视频采集卡,在linux下使用视频采集卡
  3. ctguoj--考新郎(排列组合+错排公式)
  4. 性能可靠塔式服务器,塔式服务器备受企业关注的原因有哪些
  5. linux中什么是进程名,Linux进程是什么
  6. java awt image_JAVA;使用java.awt.Image的不稳定性
  7. python枚举函数_python dict函数枚举对象
  8. 自定义Flash背景的相关设置方法以及其与目录下的文件的对应关系
  9. tp3.2 获取post,get,session,cookie变量
  10. 菜鸟的Python学习之路(流水账)