JS_高程6.面向对象的程序设计(2)创建对象_3 构造函数存在的问题
# 上次讲到用构造函数的模式来创建对象,相对于工厂模式,解决可对象识别的问题。
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 构造函数存在的问题的更多相关文章
- JS_高程6.面向对象的程序设计(2)创建对象_1
一.创建对象的常见方法 (1)Object构造函数创建单个对象,早期的JavaScript开发人员经常使用该模式创建新对象. var person=new Object(); person.name= ...
- JS_高程6.面向对象的程序设计(2)创建对象_2 构造函数也是一般函数
1.构造函数也是一般函数,以下创建一个构造函数. var Person=function(name,age,job){ this.name=name; this.age=age; this.job=j ...
- JS_高程6.面向对象的程序设计(1)理解对象
js的数据属性:P139(1)[[Configurable]](2)[[Enumerable]](3)[[Writable]](4)[[Value]] 使用Object.definerPropert( ...
- 重学js之JavaScript 面向对象的程序设计(创建对象)
注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式
·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 工厂模式和 构造函数模式
创建对象 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复代码. ·工厂模式 工厂模式是一种广为人知的设计模式,这种模式 ...
- python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象
一.面向对象的软件开发有如下几个阶段 1.面向对象分析(object oriented analysis ,O ...
- JavaScript 面向对象的程序设计(一)之理解对象属性
首先,JavaScript 面向对象的程序设计,主要分三部分. 理解对象属性: 理解并创建对象: 理解继承. 本文主要从第一方面来阐述: 理解对象属性 首先我们来理解Javascript对象是什么?在 ...
- JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承
相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...
随机推荐
- pp 总结一
1.JQ $.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- JAVA-ORM框架整理➣Mybatis操作MySQL
概述 在Java中,对数据库操作的框架很多,上节概述Hibernate的简单使用,这里简单整理Mybatis的使用.Mybatis也是简单的数据库操作框架,通过IOC方式,获取操作类对象,进行数据的操 ...
- java数组知识点总结
数组是一个用来存储同一个数据类型多个元素的一个容器(数组长度是固定的,数组中存储的元素的数据类型要求一致) 1.格式: 格式1: 数据类型[] 数组名 = new 数据类型[数组长度]; 格式2: 数 ...
- python函数式编程——返回函数
1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 2.闭包 注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还 ...
- Json传递数据两种方式(json大全)
1.Json传递数据两种方式(json大全)----------------------------字符串 var list1 = ["number","name&quo ...
- Noj - 在线强化训练1
1445 A 求n个整数的和 1564 B 判断一个数是否是完全数 1011 C 判素数(Prime number) 1566 D 输入一组整数,找出最小值 1200 E 判断三角 ...
- PAT (Basic Level) Practise - 成绩排名
1004. 成绩排名 题目链接:https://www.patest.cn/contests/pat-b-practise/1004 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓 ...
- Date、Calendar、DateFormat类
Date类与Calendar类之间的转换 package date; import java.util.Calendar; import java.util.Date; public class Da ...
- HierarchicalClustering:编写HierarchicalClustering层次聚类算法—Jason niu
from numpy import * class cluster_node: def __init__(self,vec,left=None,right=None,distance=0.0,id=N ...
- Context家族
--摘自<android插件化开发指南> 1.ContextWrapper只是一个包装类,没有任何具体的实现,真正的逻辑都在ContextImpl里面 2.应用程序中包含多个Context ...