【天赢金创】面向对象的程序设计之创建对象

对象的定义:无序属性的集合,属性的值可以是基本值、对象或者函数.
每个对象都是基于一个应用类型创建的,这个引用类型可以是内置的(例如Object Array Math),也可以是用户自定义的.

基于Object创建对象

所有的对象都是继承自Object的,因此我们可以从Object着手创建对象.

//通过new 关键字创建对象 var person = new Ojbect();
person.name = ‘yuhualinfeng‘;
person.age = 30;
person.job = ‘web developer‘; //通过对象字面量创建对象 var person = {};
person.name = ‘yuhualinfeng‘;
person.age = 30;
person.job = ‘web developer‘;

基于Object创建对象有两种形式,一种是使用new关键字,另一种是使用对象字面量.
使用这种方式创建对象的缺点是:当创建多个相同类型的对象时,会产生许多重复的代码,假如我要三个person对象,我就需要写三相同结构的代码,为了解决这个问题,我们引入了工厂模式创建对象.

使用工厂模式创建对象

工厂模式是软件工厂领域一种广为认知的设计模式,这种模式抽象了创建具体对象的过程.

function createPerson(name,age,job){ var obj = new Object();
obj.name = name;
obj.age = age;
obj.job = job; return obj;

} var person1 = createPerson(‘yuhualingfeng‘,30,‘web developer‘); var person2 = createPerson(‘obama‘,45,‘president‘);

我们创建了两个人物对象,假如我们基于Object创建对象,那么createPerson内的代码就会重复编码.
但是使用这种模式创建的对象任然有一个问题:无法得知创建的对象的类型名.解决这问题的可行方法是使用构造函数创建对象.

使用构造函数模式创建对象

function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){
        alert(this.name);
    }

} var person1 = new Person(‘yuhualingfeng‘,30,‘web developer‘); var person2 = new Person(‘obama‘,‘45‘,‘president‘);

这里我们创建了一个名为Person的引用类型,然后我们用new 关键字实例化此引用类型,这个过程可以细化为以下四个过程:

  1. 创建一个新对象
  2. 将构造函数的作用域赋值给新函数(因此this就指向这个新对象)
  3. 执行构造函数中的代码(为this对象赋值,等同于为新对象赋值)
  4. 返回新对象

我们可以用instanceof来检测person1,person2的对象类型是否为Person.

alert(person1 instanceof Person); //true alert(person2 instanceof Person); //true alert(person1 instanceof Object); //true 因为Person继承自Object,所以这里一样成立.

注:细心的朋友应该会注意到,这里的构造函数的首字母是大写,这里们遵循一个规范,普通函数的首字母大写,普通函数的首字母小写.

构造函数也有自己的缺点,大家可以看到Person包含一个sayName的函数(方法),函数也是对象(函数式Function的实例),所以每实例化一个Person,就会产生一个sayName方法,也就是一个对象,
随着创建的person实例怎多,产生的对象也相应增多,最终导致更多的内存,那么我们能不能找到更好的解决办法呢,是肯定的.

使用原型模式创建对象

我们每创建一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象而这个特定对象的用途是包含可以由特定类型的所有实例共享的属性和方法.这就意味着原型对象不会因为实例的增多二占用
更多的内存.每个原型对象都默认有一个constructor属性,故名思议,这个属性指向构造函数.下面展示了通过原型对象来创建对象.

function Person(){
}
Person.prototype.name = "yuhualingfeng";

Person.prototype.age = 30;

Person.prototype.job = "web developer";

Person.prototype.sayName=function(){
alert(this.name);
}; var person1 = new Person();
person.sayName(); //yuhualingfeng var person2 = new Person();

这里Person.prototype.constructor指向的是Person.当然你也可以向下面这样直接给原型对象赋值来创建对象.

Person.prototype={
constructor:Person,
name:"yuhualingfeng",
age:30,
job:"web developer" };

这里之所以添加了constructor属性是应为直接给原型对象赋值会把原型对象的指针指向另一个对象,以前默认的值将无法访问到.

顺便给大家介绍两个与原型对象相关的方法和in关键字:

  1. isPrototypeOf:判断是某对象否为实例的原型.
alert(Person.prototype.isPrototypeOf(person)); //true
  1. hasOwnProperty:检测某属性是存在于实例中,还是原型对象中.
alert(person1.hasOwnProperty(‘name‘)); //false,因为属性存在于原型中.
  1. in操作符:in操作符有两种使用方式,一种是单独使用,一种是和for搭配使用,单独使用的作用是判断某属性是否在某实例中访问到(无论是在实例自身的还是原型对象中的),for-in是枚举(循环)中使用.
//判断属性是否存在原型中 function hasPrototypeProperty(object,name){ return object.hasOwnProperty(name) && (name in object);

}

原型模式创建对象的缺点:实例的原型对象是共享的,当修改一个实例的属性,如果属性的值为方法或者基本类型时,不会有什么影响,当属性为引用类型时,会影响其他实例的属性值.
综合构造函数模式和原型模式创建对象,我们结合他们的优点,去粗取精,我们组合使用构造函数模式原型模式.

组合使用构造函数模式原型模式

通过构造函数创建对象的缺点是每个方法都会在实例上重新创建,造成不必要的内存消耗;通过原型创建对象的缺点在于实例引用类型值的属性会相互影响.综上考虑,我们可以把存储值得属性放在构造函数中,把方法放在原型对象中.这种模式是创建对象使用最广泛的一种,可以说是创建对象的默认模式.

function Person(name,age,job){ this.name = name; this.age = age; this.job = job;
}

Person.prototype = {
 constuctor:Person,
 sayName:function(){
     alert(this.name);
 }
}; var person = new Person(‘yuhualingfeng‘,30,‘web developer‘);
person.sayName();

以上就是创建对象的几种模式,大家可以结合它们的优缺点和你自身创建对象的用处进行权衡,然后选择适合你的创建对象的模式.

时间: 2024-11-01 02:13:25

【天赢金创】面向对象的程序设计之创建对象的相关文章

【天赢金创】10 条真心有趣的 Linux 命令

在终端工作是一件很有趣的事情.今天,我们将会列举一些有趣得为你带来欢笑的Linux命令. 1. rev 创建一个文件,在文件里面输入几个单词,rev命令会将你写的东西反转输出到控制台. # rev <file name> Selection_002 Selection_001 2. fortune 这个命令没有被默认安装,用apt-get命令安装它,fortune命令会随机显示一些句子 [email protected]:~$ sudo apt-get install fortune Sele

【天赢金创】React flux九浅一深

这个是 Facebook 官方学习 Flux 的 todo 例子 想用这个例子来总结一下怎么从零开始用 React 和 Flux 构建一个 App Structure App ├─ javascripts │ ├─ actions │ │ ├─ TodoActions.js │ ├─ components │ │ ├─ TodoComponents │ │ │ ├─ TodoApp.js │ │ │ ├─ Header.js │ │ │ ├─ MainSection.js │ │ │ ├─ Fo

python 面向对象的程序设计

一:什么是编程范式? 编程是程序员用特定的语法 + 数据结构 + 算法组成的代码来告诉计算机如何执行任务的过程. 如果把编程的过程比喻为练习武功,那么编程范式指的就是武林中的各种流派,而在编程的世界里最常见的两大流派便是:面向过程与面向对象. "功夫的流派没有高低之分,只有习武的人才有高低之分",在编程世界里更是这样,面向过程与面向对象在不同的场景下都各有优劣,谁好谁坏不能一概而论. 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有

第十篇 面向对象的程序设计

第十篇 面向对象的程序设计 阅读目录 一 面向对象的程序设计的由来 二 什么是面向对象的程序设计及为什么要有它 三 类和对象 3.1 什么是对象,什么是类 3.2 类相关知识 3.3 对象相关知识 3.4 对象之间的交互 3.5 类名称空间与对象/实例名称空间 3.6 小结 四 继承与派生 4.1 什么是继承 4.2 继承与抽象(先抽象再继承) 4.3 继承与重用性 4.4 组合与重用性 4.5 接口与归一化设计 4.6 抽象类 4.7 继承实现的原理(继承顺序) 4.8 子类中调用父类方法 五

走入计算机的第二十八天(面向对象的程序设计)

一  什么是面向对象的程序设计及为什么要有它 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是

面向对象的程序设计:Object-oriented programming

在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象. 在现实世界里我们所面对的事情都是对象,如计算机.电视机.自行车等. 对象的主要三个特性: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型. 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同. 比如 Animal(动物) 是一

python之面向对象的程序设计

第一:程序设计思想与发展历程(了解) 1940年以前:面向机器编程最早的是采用机器语言编程,也就是直接使用二进制码来表示机器能够识别的指令和数据.优点:机器语言由机器直接执行,速度快缺点:写起来非常困难,并且不容易修改 汇编语言:用助记符号代替机器指令的操作码,用地址符号或者标号代替指令或操作数的地址优点:比机器语言的二进制码编写方便些缺点:汇编语言本质上还是一种面向机器的语言,编写困难,易出错 脱离机器后:面向过程编程面向过程的结构化程序设计强调功能的抽象和程序的模块化, 它将解决问题的过程看

JavaScript 面向对象的程序设计记录笔记2(设计模式)

以下为JavaScript高级程序设计 第六章面向对象的程序设计6.2节 创建对象(设计模式部分)读书记录. 1)工厂模式: function createPerson(name, age, sex) { var o = new Obejct(); o.age = age; o.sex = sex; o.name = name; return o; } var person = createPerson('Tom', 12, 'male'); var person = createPerson(

c++面向对象的程序设计

1.面向对象的程序设计的核心思想是数据抽象.动态绑定和继承. 继承:根部称作基类,继承得来的类称作派生类.派生类必须通过使用派生类列表来明确指出它是从哪个基类继承而来的,列表形式是一个冒号,后面紧跟逗号分隔的基类列表.基类可将函数声明成虚函数来让派生类定义自己的版本. 动态绑定:动态绑定指的是在运行时才知道函数的运行版本,因此我们在使用基类的引用(或指针)调用一个虚函数时会发生动态绑定. 2.定义基类和派生类 a.基类通常该定义一个虚析构函数: b.成员函数如果没被声明为虚函数,其解析过程发生在