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++语言学习笔记:C++ 多态

    多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态. C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数. 下面的实例中,基类 Sh ...

  2. com.alibaba.druid.pool.DruidDataSource

    https://www.cnblogs.com/wuyun-blog/p/5679073.html DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PR ...

  3. 将已有微信小程序转换为多端应用

    文档地址 https://nervjs.github.io/taro/

  4. Windows2008R2安装DNS和SQLServer200r2服务 (9.18第七天)

    原文网址:https://www.cnblogs.com/yankaohaitaiwei/p/11538205.html 二.IIS搭建web服务器 1.格式化D盘,一定要选择NTFS!!!不然后面添 ...

  5. UVA - 10886 Standard Deviation (标准差)(数论)

    题意:下面是一个随机数发生器.输入seed的初始值,你的任务是求出它得到的前n个随机数标准差,保留小数点后5位(1<=n<=10000000,0<=seed<264). 分析: ...

  6. oracle学习笔记(3)

    使用profile文件对口令进行管理 sql>create profile 文件名 limit failed_login_arrempts 3 password_lock_time 2; 将配之 ...

  7. Day 11:静态导入、增强for循环、可变参数的自动装箱与拆箱

    jdk1.5新特性-------静态导入 静态导入的作用: 简化书写. 静态导入可以作用一个类的所有静态成员.  静态导入的格式:import static 包名.类名.静态的成员: 静态导入要注意的 ...

  8. python numpy 矩阵左右翻转/上下翻转

    numpy API: flattened flip() (in module numpy) fliplr() (in module numpy) flipud() (in module numpy) ...

  9. Linux学习-第二章(命令)20200216

  10. Git--记一次丢失本地记录但是代码已提交到gerrit

    参考 https://blog.csdn.net/yucendulang/article/details/76199913 https://stackoverflow.com/questions/28 ...