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. 实验吧-web-天下武功唯快不破(Python中byte和str的转换)

    题目:看看响应头 打开网站,既然已经提示我们看响应头了,那我们就看看呗(习惯bp,也可直接F12查看) 可以看到,响应头部分有个FLAG,而且有提示:please post what you find ...

  2. 通过request获得全路径

     <% String test = request.getScheme()+"://"+request.getServerName()+":"+reque ...

  3. Kaggle: House Prices: Advanced Regression Techniques

    Kaggle: House Prices: Advanced Regression Techniques notebook来自https://www.kaggle.com/neviadomski/ho ...

  4. 使用GDI+显示OpenCV中的图像IplImage

    OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...

  5. grep -q

    grep -q用于if逻辑判断      安静模式,不打印任何标准输出.如果有匹配的内容则立即返回状态值0. grep -q的用法 #  if  grep -q hello a.txt ; then ...

  6. 八、SAP中使用MOVE来赋值

    一.使用MOVE和使用等号的效果是等同的,代码如下: 二.效果如下:

  7. linux中redis伪主从搭建

    1.解压redis.tgz到usr/local/redis下 2.在redis/下执行 make 3.在redis/src/下执行 make install PREFIX=/usr/local/red ...

  8. JAVA基础——使用配置文件

    一. 前言         日常我们做项目中,我们经常会遇到这样的情况:由于开发环境和生产环境的不同,项目部署在生产环境之前,有些参数我们并不知道如何取值.例如:数据库链接设定,我们在部署生产环境之前 ...

  9. 线程与进程 concurrent.futures模块

    https://docs.python.org/3/library/concurrent.futures.html 17.4.1 Executor Objects class concurrent.f ...

  10. Arduino串口的一些高级用法

    1.配置串口通信数据位.校验位.停止位通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率.而使用Serial.begin(speed, config) ...