JS面向对象设计-创建对象

Object构造函数和对象字面量都可以用来创建单个对象,但是在创建多个对象时,会产生大量重复代码.

1.工厂模式

工厂模式抽象了创建具体对象的过程.由于ECMAScript无法创建类,我们用函数来封装以特定接口创建对象的细节.

function createPerson(name, age, job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        console.log(this.name);
    }
    return o;
}

// 根据接收到的参数,构建一个包含三个属性一个方法的对象,并返回
var person1 = createPerson("zhu", 26, "FE");

ps. 工厂模式解决了创建多个相似对象的问题,却无法识别对象(对象的类型)

2.构造函数模式

用来创建特定类型的对象,比如Object/Array这样的原生构造函数,或者自定义构造函数(可以自定义对象类型的属性和方法).

/* 1.没有显示创建对象
*  2.直接将属性和方法赋值给this对象
*  3.没有return语句
*  4.首字母大写(区别于ECMAScript中其他函数,构造函数本身也是函数,只不过可以创建对象)
*/
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        console.log(this.name);
    }
}

// 必须使用new操作符
var person1 = new Person("zhu", 26, "FE");
var person2 = new Person("liu", 23, "JAVA");

2.1 调用该总种构造函数会经历四个步骤

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

2.2 对象类型

  1. person1,person2分别保存着Person的一个不同实例,两个对象都有constructor(构造函数)属性指向Person.

    js person1.constructor == Person, person2.constructor == Person // true

  2. person1,person2既是Object实例也是Person实例.
    // 所有对象均继承自Object
    person1 instanceof Object, person1 instanceof Person // true
    person2 instanceof Object, person2 instanceof Person // true

    ps. 创建自定义构造函数意味着可以将它的实例标识为一种特定的类型.

2.3 将构造函数当作函数

构造函数与普通函数的区别在于调用它们的方式不同,只要通过new操作符调用,它就可以作为构造函数.

// 当作构造函数使用,使用new操作符来创建一个新对象.
var person = new Person("zhu", 26, "FE");
person.sayName();

// 作为普通函数调用,属性和方法都被添加到window对象.
// 在全局作用域中调用一个函数时,this对象总是指向Global对象(在浏览器中就是window对象)
Person("zhu", 26, "FE");
window.sayName();

// 使用call()或者apply()在某个特定对象的作用域中调用
var o = new Object();
Person.call(o, "zhu", 26, "FE");
o.sayName();

ps. 构造函数模式定义的构造函数是定义在Global对象中的.

2.4 构造函数的问题

每个方法都要在每个实例上重新创建一遍,person1和person2的同名sayName方法不是同一个function的实例.

ps. ECMAScript的函数是对象,因此每定义一个函数,也就实例化一个对象.即每个Person实例都包含一个不同function实例.

// 逻辑上的构造函数可以这样定义
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayName = new function() {
        console.log(this.name);
    }
}

没有必要创建两个完成同样任务的function实例,然而将sayName提到全局虽然解决做同一件事的问题,但是实际上只能被某个对象调用,而且可能需要定义很多全局函数(无封装性).

原文地址:https://www.cnblogs.com/LittlePANDA-ZSJ/p/11074523.html

时间: 2024-10-29 19:06:04

JS面向对象设计-创建对象的相关文章

浅谈JS面向对象之创建对象

hello,everybody,今天要探讨的问题是JS面向对象,其实面向对象呢呢,一般是在大型项目上会采用,不过了解它对我们理解JS语言是很大的意义. 首先什么是面向对象编程(oop),就是用对象的思想去写代码,那什么是对象呢,其实我们一直在用,像数组 Array  时间 Date 都是对象,并且这些对象是系统创建的,所以叫系统对象,而我们自己当然也可以创建对象,一般对象有两部分组成: 1 方法 (动态的 对象下面的函数)比如Array 的push(),sort()方法 2  属性 (静态的,相

js面向对象设计之function类

/*本文并非是介绍JavaScript的原型的原理的文章, **仅仅讨论function作为类来使用时如何近似传统的面向对象设计 **/ /*function作为类的用法 **下面是一个最简单的类 **实例将有自己的属性val和pVal,也有方法printVal和pMethod **/ function Class01( val, pVal ) { this.val = val; /*实例可直接读写的属性*/ var pVal = pVal; /*实例无法直接读写的属性*/ } Class01.

js面向对象之创建对象1

方法一:工厂模式 所谓工厂模式,简单点儿说就是按照工厂生产的过程创建对象,原材料->加工->返还产品 1 function createPerson(name,age,job) 2 { 3 //送入原材料 4 var o = new Object(); 5 //加工 6 o.name = name; 7 o.age = age; 8 o.job = job; 9 o.sayName = function(){ 10 alert(this.name); 11 } 12 //出厂 13 retur

js面向对象之创建对象

工厂模式 function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = createPerson('zy1',28,'new worker'); var person2 = createPerson('zy2',29,'n

读Javascript高级程序设计第三版第六章面向对象设计--创建对象

虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是缺点非常明显:使用同一接口创建很多对象,会产生大量重复代码. 工厂模式  1 function CreatePerson(name,age,job){ 2         var o=new Object(); 3         o.name=name; 4         o.age=age; 5         o.job=job; 6         o.sayName=function(){ 7            

JS面向对象之创建对象模式

虽然Object构造函数或对象字面量都可以用来创建单个对象,但都有一个缺点,使用同一个接口来创建对象,会产生大量重复的代码,为解决这个问题,引出下列方法 1.工厂模式 抽象了创建具体对象的过程,用函数来封装以特定接口创建对象的细节.比如 function createPerson(name,age,job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function () { aler

JS面向对象设计(1)-理解对象

不同于其他面向对象语言(OO,Object-Oriented),JS的ECMAScript没有类的概念, 它把对象定义为"无序属性(基本值.对象.函数)的集合",类似于散列表. 每个对象都是基于一个引用类型(原生类型.自定义类型)创建的. 1. 理解对象 创建自定义对象(Object构造函数.对象字面量). // Object构造函数:创建一个Object实例,再为实例添加属性和方法. var person = new Object(); person.name = "xia

js面向对象设计

1.对象   属性     方法    对象往往用名词来表示    方法一般都是些动词    属性值则往往是一些行容词 (例如:黑猫睡在我头上)猫为对象,黑为形容词,我头上为方法,睡为参数 2.类  类更多的是一个模板,而对象就是这些模板的基础上被创建出来的  (例如:老鹰属于鸟类) 3.封装    封装主要有两个部分组成 1.相关的数据(用于储存属性)2.基于这些属性所能做的事    封装还有隐藏信息的概念    如:public(公有)  private(私有) protected(受保护的

【JavaScript】 JS面向对象的模式与实践 (重点整治原型这个熊孩子 (/= _ =)/~┴┴ )

参考书籍 <JavaScript高级语言程序设计>—— Nicholas C.Zakas <你不知道的JavaScript>  —— KYLE SIMPSON 在JS的面向对象编程中,我们最为关注的是两种行为,一是创建对象,二是类继承 JS创建对象 构造函数模式创建对象 第一种创建对象的方式是构造函数模式 如下所示, 将构造函数中的属性和方法赋给一个新对象 /** * description: 构造函数模式创建对象 */ function Type (p) {   this.par