博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建对象
阅读量:4473 次
发布时间:2019-06-08

本文共 2601 字,大约阅读时间需要 8 分钟。

一、工厂模式

虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的优缺点:使用同一个接口创建很多对象,会产生搭理那个的重复代码,为乐解决这个问题,人们开始使用工厂模式的一种变体

eg: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('Nichholas',29,'Software Engineer');var person2 = createPerson('Greg',27,'Doctor')

函数createPerson能够根据接收的参数来构建一个包涵所有必要信息的person对象,可以无数次调用,工厂模式虽然解决了创建多个相似对象的问题,但却没有解决识别的问题,随着js发展,又一个新模式出现了

 

二、构造函数模式

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

在这个例子中,Person()函数取代了createPerson()函数,他们的不同之处
1、没有显示的创建对象
2、直接将属性和方法赋给了this对象
3、没有return语句
此外,还应该注意到函数名 Person 使用的是大写字母 P。按照惯例,构造函数始终都应该以一个 大写字母开头,而非构造函数则应该以一个小写字母开头

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

eg: alert(person1.constructor == Person); //truealert(person2.constructor == Person); //true 10

对象的 constructor 属性最初是用来标识对象类型的。但是,提到检测对象类型,还是instan- ceof操作符要更可靠一些。我们在这个例子中创建的所有对象既是 Object 的实例,同时也是 Person 的实例,这一点通过 instanceof 操作符可以得到验证。

eg:alert(person1 instanceof Object); //truealert(person1 instanceof Person); //truealert(person2 instanceof Object); //truealert(person2 instanceof Person); //true

构造函数模式虽然好用,但也并非没有缺点。使用构造函数的主要问题,就是每个方法都要在每个 实例上重新创建一遍

function Person(name, age, job){    this.name = name;    this.age = age;    this.job = job;    this.sayName = new Function("alert(this.name)"); // 与声明函数在逻辑上是等价的 }

从这个角度上来看构造函数,更容易明白每个Person实例都包含一个不同的Function实例(以 显示 name 属性)的本质。说明白些,以这种方式创建函数,会导致不同的作用域链和标识符解析,但 创建 Function 新实例的机制仍然是相同的。因此,不同实例上的同名函数是不相等的,

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

这样一来,由于 sayName 包含的是一个指向函数 的指针,因此 person1 和 person2 对象就共享了在全局作用域中定义的同一个 sayName()函数。这 样做确实解决了两个函数做同一件事的问题,可是新问题又来了:在全局作用域中定义的函数实际上只 能被某个对象调用,这让全局作用域有点名不副实,可以通过使用原型模式来解决

三、原型模式

function Person(){}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.job = "Software Engineer";Person.prototype.sayName = function(){    alert(this.name);};var person1 = new Person();person1.sayName(); //"Nicholas"var person2 = new Person();person2.sayName(); //"Nicholas"alert(person1.sayName == person2.sayName); //true

在此,我们将 sayName()方法和所有属性直接添加到了 Person 的 prototype 属性中,构造函数 变成了空函数。即使如此,也仍然可以通过调用构造函数来创建新对象,而且新对象还会具有相同的属 性和方法。但与构造函数模式不同的是,新对象的这些属性和方法是由所有实例共享的。换句话说, person1 和 person2 访问的都是同一组属性和同一个 sayName()函数

转载于:https://www.cnblogs.com/wzndkj/p/7788208.html

你可能感兴趣的文章
面向连接的TCP概述
查看>>
前端快捷方式 [记录]
查看>>
亲测可用,解决端口被占用的指令!!
查看>>
MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引
查看>>
WinPE启动U盘的制作方法与软件下载(通用PE工具箱/老毛桃/大白菜WinPE)(转载)...
查看>>
PMP学习感想
查看>>
集合-强大的集合工具类:java.util.Collections中未包含的集合工具
查看>>
CSS清除浮动
查看>>
转:iphone 申请证书
查看>>
Python就业方向
查看>>
一步步学习SPD2010--第二章节--处理SP网站(3)--创建网站层次架构
查看>>
TCP
查看>>
10个经典的C语言面试基础算法及代码
查看>>
普通的java Ftp客户端的文件上传
查看>>
视图系统
查看>>
Palindromes _easy version
查看>>
vue 小记
查看>>
CURRICULUM VITAE
查看>>
Groovy 程序结构
查看>>
SpringAOP用到了什么代理,以及动态代理与静态代理的区别
查看>>