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

 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. BootStrap标题制作模板

    <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="UTF-8&q ...

  2. JDK1.8 JVM参数配置

    JAVA_OPTS=" -server #服务器模式 -Xmx4g #JVM最大允许分配的堆内存,按需分配 -Xms4g #JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JV ...

  3. C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号

    class Program { static void Main(string[] args) { Log("测试"); Console.Read(); } public stat ...

  4. order by 导出数据不一致的问题

    转自 http://blog.csdn.net/wwwwei_csdn/article/details/78181197 前言   数据库分页是后台经常要使用的技术手段,有时候进行数据库查询会根据业务 ...

  5. 1000. A+B Problem

    Description Calculate a+b Input Two integer a,b (0<=a,b<=10) Output Output a+b Sample Input 1 ...

  6. 【转】 诡异的ORA-02289: sequence does not exist

    原文地址:http://blog.itpub.net/20801486/viewspace-695651/ 今天被开发人员告知在应用用户下无法查询自己创建的sequence的nextval值.当执行s ...

  7. net core体系-2继续认识net core

    认识net core,net core到底啥?从哪说起呢?我想作为开发的码农,web项目不陌生吧,那就从对应的.net web 对应的net core Web Application项目开始吧. 下面 ...

  8. 048 SparkSQL自定义UDAF函数

    一:程序 1.需求 实现一个求平均值的UDAF. 这里保留Double格式化,在完成求平均值后与系统的AVG进行对比,观察正确性. 2.SparkSQLUDFDemo程序 package com.sc ...

  9. IDEA创建lo4j模板

    复制文字到文本框中: log4j.rootLogger=DEBUG,stdout log4j.logger.org.mybatis=DEBUG log4j.appender.stdout=org.ap ...

  10. Codeforces 208A-Dubstep(字符串)

    Vasya works as a DJ in the best Berland nightclub, and he often uses dubstep music in his performanc ...