#  上次讲到用构造函数的模式来创建对象,相对于工厂模式,解决可对象识别的问题。

 function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayname=function(){
console.log(this.name);
}
} var person1=new Person("xiaoming",12,"Doctor");
person1.sayname();//xiaoming

#  如上,是使用构造函数模式创建对象的形式。使用构造函数的主要问题是,每个方法都要在每个实例上重新创建一次。其实质可以效果等同于以下形式:

 function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayname=new Function("console.log(this.name)");
} var person1=new Person("xiaoming1",12,"Doctor");
var person2=new Person("xiaoming2",12,"Doctor");
person1.sayname();//xiaoming1
person2.sayname();//xiaoming2

# 从以上代码看,虽然 person1和person2都有一个sayname方法,但是其实两个是不同的Function实例。如下:

 console.log(person1.sayname==person2.sayname);//false

#  这样,当我们创建很多实例对象时,相当于同时创建了很多完成同样的任务的不同的sayname()方法,显然不是很好!

#  尝试着把函数定义转移到构造函数外部,如下:

 function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayname=sayname;
}
function sayname(){
console.log(this.name);
}
var person1=new Person("xiaoming1",12,"Doctor");
var person2=new Person("xiaoming2",12,"Doctor");
person1.sayname();//xiaoming1
person2.sayname();//xiaoming2 console.log(person1.sayname==person2.sayname);//true

#  如上,这样写话就解决了多个函数完成同样的功能的问题,person1和person2实际上共享了全局作用域中的sayname函数。

#  但是这里存在以下问题:

  (1)在全局作用域中定义的sayname函数实际上只是被Person对象调用,这样让全局作用域有点名不副实。

  (2)如果对象中需要定义很多方法,意味着需要定义很多全局函数。

  (3)Person这个自定义的对象类型没有封装性可言。

~~可以通过原型模式解决上面的问题。

JS_高程6.面向对象的程序设计(2)创建对象_3 构造函数存在的问题的更多相关文章

  1. JS_高程6.面向对象的程序设计(2)创建对象_1

    一.创建对象的常见方法 (1)Object构造函数创建单个对象,早期的JavaScript开发人员经常使用该模式创建新对象. var person=new Object(); person.name= ...

  2. JS_高程6.面向对象的程序设计(2)创建对象_2 构造函数也是一般函数

    1.构造函数也是一般函数,以下创建一个构造函数. var Person=function(name,age,job){ this.name=name; this.age=age; this.job=j ...

  3. JS_高程6.面向对象的程序设计(1)理解对象

    js的数据属性:P139(1)[[Configurable]](2)[[Enumerable]](3)[[Writable]](4)[[Value]] 使用Object.definerPropert( ...

  4. 重学js之JavaScript 面向对象的程序设计(创建对象)

    注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...

  5. js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式

    ·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...

  6. js面向对象的程序设计 --- 中篇(创建对象) 之 工厂模式和 构造函数模式

    创建对象 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复代码. ·工厂模式 工厂模式是一种广为人知的设计模式,这种模式 ...

  7. python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象

    一.面向对象的软件开发有如下几个阶段                                              1.面向对象分析(object oriented analysis ,O ...

  8. JavaScript 面向对象的程序设计(一)之理解对象属性

    首先,JavaScript 面向对象的程序设计,主要分三部分. 理解对象属性: 理解并创建对象: 理解继承. 本文主要从第一方面来阐述: 理解对象属性 首先我们来理解Javascript对象是什么?在 ...

  9. JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承

    相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...

随机推荐

  1. php把一些预定义的 HTML 实体转换为字符。

    htmlspecialchars_decode() echo htmlspecialchars_decode($condition,ENT_QUOTES) '  会被转成 单引号

  2. Kudu-压缩

    随着时间的推移,tablet会积累许多DiskRowSets,并且会在行更新时累积很多增量重做(REDO)文件.当插入一个关键字时,为了强制执行主关键字唯一性,Kudu会针对RowSets查询一组布隆 ...

  3. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-1目录

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  4. jav实验二

    实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验内容 1.参考Intellj ID ...

  5. JDK自带工具keytool生成ssl证书

    前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全. 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具: ...

  6. ORA-12154: TNS: 无法解析指定的连接标识符 问题

    ORA-12154: TNS: 无法解析指定的连接标识符 问题:https://zhidao.baidu.com/question/397519550.html

  7. day20 模块-sys,time,collection

    所有常用模块的用法:  http://www.cnblogs.com/Eva-J/articles/7228075.html 前情回顾: # 常用模块 # 常用模块 —— 东西多 # 异常处理 # 什 ...

  8. Extracted SQL state class 'S1' from value 'S1009'

    发现不查所有字段时是可以查询的,最后一个个字段尝试,发现是在passwd_time这个字段时有问题,然后看看这个时间 是无效的时间,改成有效时间即可.     相关链接: Mysql 时间 '0000 ...

  9. centos7如何添加开机启动服务/脚本

    一.添加开机自启服务 在centos7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例): systemctl enable jenkins.service #设置jenkins服务为 ...

  10. Philosopher’s Walk(递归)

    In Programming Land, there are several pathways called Philosopher’s Walks for philosophers to have ...