6.2创建对象

方法:对象字面量  object构造函数

缺点:都是创建单个对象。同一个接口创建多个对象,会产生大量重复代码

6.2.1工厂模式

用函数封装以特定的接口创建对象

function createPerson (name,age) { //返回一个对象的函数就是工厂函数
var obj = {
name: name,
age: age,
sstName: function (name) {
this.name = name
}
}
return obj
}
  • 适用场景:需要创建多个对象。
  • 缺点: 对象没有一个具体的类型、都是Object类型。

6.2.2构造函数模式

与工厂函数区别:

  • 没有return
  • 没有显式创建对象
  • 直接将属性和方法赋予给this

要创建新实例,必须用new操作符

  • 创建一个新对象
  • 将构造函数的作用域赋予给新对象(因此this便指向新对象)
  • 执行构造函数中的代码(为这个新对象添加属性)
  • 返回新对象
function Person (name,age) {
this.name = name
this.age = age
this.setName = function (name) {
this.name = name
}
}
var p1 = new Person('tom',15)
var p2 = new Person('jack',14) console.log(p1 instanceof Person) //true p1是Person类型 function student (name,grade) {
this.name = name
this.grade = grade
} var s1 = new student('peter',6)
console.log(s1 instanceof student) //true s1是student类型 console.log(p1,p2)
  • 使用场景: 需要创建多个类型确定的对象。(实例标示为以˙哦那个特定的类型)
  • 缺点: 每个对象都有相同的数据(方法),浪费内存。

//不同实例里面创建的方法,不是同一个function的实例 他们是不想等的,因此,创建两个完成同样任务的function实力实在多余

c = function() {console.log("sad")}
b = function() {console.log("sad")} b instanceof c // false
b === c //false 就算是功能相同的两个函数也是不想等 甚至就算是同名
【在js中,引用类型比较的是地址, 函数是一种引用类型】,而是存在两个不同
的内存地址

可以把函数写在构造函数外面 然后再引用

但是 但是全局函数非常容易被覆盖,也就是大家经常说的污染全局变量.

6.2.3原型模式

在构造器内部创建的实例方法会阻挡原型上定义的同名方法

 function Persion() {

        this.likeIceCream = false;

        this.like = function () {

            return !this.likeIceCream;

        }

    }

    Persion.prototype.like = function () {

        return this.likeIceCream;

    }

    var p = new Persion();

    p.like();//true

初始化操作的优先级如下:

  1. 首先,通过原型给对象实例添加属性
  2. 在构造器内部,给对象实例添加的属性

例子

    function Persion() {

        this.likeIceCream = false;

       Persion.prototype.like = function () {

            return !this.likeIceCream;

        }

    }

    Persion.prototype.like = function () {

        return this.likeIceCream;

    }

    var p = new Persion();

    p.like();  //true

在构造器内部的绑定操作优先级用于都高于在原型上的绑定操作的优先级。因为构造器的this上下文指向的是实例自身,所以,可以在构造器内对核心内容执行初始化操作

    function Persion() {

        this.likeIceCream = false;

       Persion.prototype.like = function () {

            return !this.likeIceCream;

        }

    }

    Persion.prototype.like = function () {

        return this.likeIceCream;

    }

Persion.prototype.like// () {

        return this.likeIceCream;

    }  说明影响的原因  是后来又调用了一次
    function Persion() {

        this.likeIceCream = false;

       Persion.prototype.like = function () {

            return !this.likeIceCream;

        }

    }

    Persion.prototype.like = function () {

        return this.likeIceCream;

    }

    var p = new Persion();

    p.like();

    Persion.prototype.like = function () {

        return this.likeIceCream;

    }

  Persion.prototype.like //

    Persion.prototype.like = function () {

        return this.likeIceCream;

    }

不能通过实例重写原型中的值

但是如果原型中是引用型的  实例对其操作  会影响原型中的引用类型数值

面向对象 part3 构造函数 原型函数的更多相关文章

  1. javascript 面向对象 new 关键字 原型链 构造函数

    JavaScript面向对象JavaScript 语言使用构造函数(constructor)作为对象的模板.所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描述 ...

  2. 从认识面向对象到构造函数的标准写法(构造函数的继承、多态、ECMA6中新代替语法class) - 下

    笔记一个包含:认识面向对象.构造函数的封装.继承.多态.ECMA6中新代替语法class 下:包括构造函数的继承.多态.ECMA6中新代替语法class 构造函数的继承 从父一级延续下来的属性和功能( ...

  3. 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统

    面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...

  4. JavaScript面向对象深入理解原型

    原型模式 function Person(){ } Person.prototype.name="Ewarm"; Person.prototype.age="29&quo ...

  5. php面向对象之构造函数作用与方法

    什么是构造函数呢?构造函数又有什么作用呢? 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个 ...

  6. PHP面向对象 实例化 构造函数 封装 继承 静态

    PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...

  7. js构造函数+原型

    注:普通对象与函数对象 var o1 = {}; var o2 =new Object(); var o3 = new f1(); function f1(){}; var f2 = function ...

  8. JS特殊函数(Function()构造函数、函数直接量)区别介绍

    函数定义 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及置于括号中的待执行代码. 函数的构造语法有这三种: 1.function functionName(arg0, ...

  9. Node.js:util.inherits 面向对象特性【原型】

    /** * Created by Administrator on 2014/9/4. */ var util = require('util'); function Base() { this.na ...

随机推荐

  1. C# Stream篇(七) -- NetworkStream

    NetworkStream 目录: NetworkStream的作用 简单介绍下TCP/IP 协议和相关层次 简单说明下 TCP和UDP的区别 简单介绍下套接字(Socket)的概念 简单介绍下Tcp ...

  2. python_生成器小结

    #__author : "ziChuan" #__data : 2019/7/19 import random # print(random.random()) # print(r ...

  3. 编程入门-Eclipse基本使用

    编程入门-Eclipse基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设置Eclipse的基本参数 1>.修改Eclipse默认的文件编码为"utf- ...

  4. UVA - 120 Stacks of Flapjacks(煎饼)

    题意:一叠煎饼,每个煎饼都有一个数字,每次可以选择一个数k,把从锅底开始数第k张以及其上面的煎饼全部翻过来,最终使煎饼有序排列(锅顶最小,锅底最大). 分析:依次从锅底向上,优先排数字最大的煎饼.每次 ...

  5. tx2的一些系统命令

    查看TX2 ubuntu系统版本命令:https://blog.csdn.net/zhengxiangwen/article/details/60324802 sudo uname --m

  6. 13 ~ express ~ 后台页面的搭建

    一, 后台路由文件  /router/admin.js  var express = require('express') var router = express.Router() /** * 验证 ...

  7. date linux系统校正时间

    date命令使用 -d<字符串>  显示字符串所指的日期与时间.字符串前后必须加上双引号.   date -d '13 second ago' ‘+%T’  13秒前   date +%T ...

  8. 用Spring中的ResponseEntity文件批量压缩下载

    我看了很多网上的demo,先生成ZIP压缩文件,然后再下载. 我这里是生成ZIP文件流 进行下载.(核心代码没多少,就是一些业务代码) @RequestMapping(value = "/& ...

  9. Redis获取缓存异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX

    Redis获取缓存异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX. 出现这种异常,我需要自 ...

  10. Essay写作“短路”怎么办?

    有些留学生在完成essay写作过程中可能会短路,写着写着不知道自己在写什么,或者是直接动不了笔了,这种情况下应该怎么办呢?下面Australiaway小编就跟同学们分享一些比较有用的方法,希望可以帮到 ...