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. ubuntu18.04.2 hadoop3.1.2+zookeeper3.5.5高可用完全分布式集群搭建

    ubuntu18.04.2 hadoop3.1.2+zookeeper3.5.5高可用完全分布式集群搭建 集群规划: hostname NameNode DataNode JournalNode Re ...

  2. 怎么在一个servlet中实现多个功能 ?如何使一个Servlet处理多个请求?

    自学javaweb一直不知道一个servelt可以有多个功能!看了别人代码才知道这个可以有! 平时你建立servelt时候你会吧doget和dopost这两个勾上,要想实现多个功能,你不必要勾选dog ...

  3. vue-router 二级路由(父子路由)

    使用二级路由 会显示父路由下面的子路由  且父子路由同时显示 因为父子同时显示  路由地址在同一级别/ 路由的显示模式有两种(都是为了减少数据库后台请求次数) #hash模式(#是特殊字符,很多场合不 ...

  4. TX2--安装跑一python3.5

    sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-ins ...

  5. openstack trove实例状态转换条件--Mitaka版本

    今天研究了一下trove的instance状态转换条件.发现其实设计的挺复杂的.后来思考了一下这样设计的原因.我觉得大致是因为,如果instance的状态全部来自于instance上跑的数据库服务本身 ...

  6. sqlserver 联接查询的一些注意点

    1.内连接的安全性 (1) inner join 是ANSI SQL-92 语法.等值联接是ANSI SQL-89 的语法 ,两者已相同方式解释.在性能上没有差别 (2)但是强烈建议使用ANSI SQ ...

  7. mysql 锁表的处理方式

    MySQL错误:ERROR 1205 (HY000): Lock wait timeout   处理方案:   执行mysql命令:show full processlist;   然后找出插入语句的 ...

  8. iOS下JS与原生的交互一

    本篇主要讲的是UIWebView和JS的交互,在下一节会有wkWebView和JS交互的详解https://www.cnblogs.com/llhlj/p/9144110.html JS调用原生OC ...

  9. [题解] CF438E The Child and Binary Tree

    CF438E The Child and Binary Tree Description 给一个大小为\(n\)的序列\(C\),保证\(C\)中每个元素各不相同,现在你要统计点权全在\(C\)中,且 ...

  10. JavaScript—纯函数

    定义 一个函数的返回结果只依赖它的参数,而且在计算过程中不会产生其他副作用,也就是不会对外部的数据造成影响或改变. 理解:函数的返回结果只依赖它的参数 const a= 1; const b= (c) ...