对象

JS中的对象是无序属性的集合,属性可以包括基本值、对象、函数。简而言之,JS中的对象就是一组键值对。

创建对象

工厂模式

工厂模式是用函数将创建对象的细节封装起来。

function createPerson(name){var o = new Object();
o.name = name;
return o;}

特点:显式地创建对象,有return
问题:无法解决对象识别的问题

构造函数模式

类似Object、Array等原生构造函数,我们可以自定义构造函数。

function Person(name){
this.name = name;
this.sayHello = function(){
alert('hello' + this.name)}
}var person1 = new Person("Peter");
var person2 = new Person("Mike");

特点:不显式地创建对象,没有return,构造函数的首字母大写,不同实例之间具有相同的constructor属性。
问题:不同实例之间的同名函数不相等(具有不同的作用域链和标识符解析)
解决:将函数的定义移到构造函数外部。

function Person(name){
this.name = name;
this.sayHello = sayHelo;
}function sayHello(){
alert('hello' + this.name)}
}

问题:sayHello定义在全局作用域,但实际上只能被某个对象调用。名不副实。2. 在需要定义很多方法的情况下,需要定义很多全局函数,违背封装的理念。
解决:原型模式

原型模式

每一个函数都有一个原型属性,这个原型是一个指针,指向一个对象。
这个对象包含同一构造函数所创建的所有实例所共享的属性和方法。

function Person(){
}Person.prototype.name = 'Mike';
Person.prototype.sayHello = function(){
alert('hello'+this.name);
}

事实上,上文提到的constrcutor属性,也存在于原型对象中。
访问对象属性时,首先查找实例本身,然后查找原型对象。如果实例本身具有该属性,就会屏蔽原型对象中的同名属性。

用对象字面量来重写

function Person(){
}Person.prototype = {
name:'Mike';
sayHello = function(){
alert('hello'+this.name);
}

此时

var mike = new Person
mike.constructor == Person //false
mike.constructor == Object //false

更正:

Person.prototype = {
constructor:Person
name:'Mike';
sayHello = function(){
alert('hello'+this.name);
}

进一步更正:

Object.defineProperty(Person.prototype,"constructor",{
enumerable: false,
value:Person
})

构造函数与原型模式组合

function Person(name){
this.name = name;
this.friends = ['a','b']}Person.prototype = {
constructor:Person;
sayHello: function(){
alert('hello'+this.name)
}
}

优点:每个实例拥有自己的属性,不会互相干扰。

动态原型模式

function Person(name){
this.name = name;
this.friends = ['a','b']}if(typeof sayHello != function){ // 只需判断一个
Person.prototyp.sayHello = function(){
alert('hello'+this.name)
}
Person.prototyp.sayBye = function(){
alert('Bye'+this.name)
}
}

优点:将所有信息封装在构造函数中,而只在第一次初始化时,添加原型方法。

寄生构造函数模式

在不改变某对象原型的情况下,添加新的方法。

function SpecialArray(){var values = new Array();values.toPipedString = function(){
return this.join('|');
}return values;}

缺点:对象与构造函数之间没有关系,不能使用instanof操作符。

稳妥构造函数模式

function Person(name){
var o = new Object();
o.sayName = function(){
alert(name)
}
return o;
}var mike = Person('mike');

特点:不使用new操作符,实例方法中不引入this。
缺点:对象与构造函数之间没有关系,不能使用instanof操作符。

转载于:https://www.cnblogs.com/cogons/p/6628985.html

JavaScript中的面向对象(1):对象创建模式相关推荐

  1. 如何理解并学习javascript中的面向对象(OOP)

    本文不适合javascript初学者看(javascript水平还停留在函数级别的朋友,看了会觉得很晕的).如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的 ...

  2. Singleton(单件)--对象创建模式

    Singleton(单件)–对象创建模式 一.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 二.动机 1.在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能 ...

  3. Prototype(原型)--对象创建模式

    Prototype(原型)–对象创建模式 一.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.动机 1.在软件系统中,经常面临着"某些结构复杂的对象"的 ...

  4. Abstract Factory(抽象工厂)--对象创建模式

    Abstract Factory (抽象工厂)–对象创建模式 一.意图 提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类. 二.动机 1.在软件系统中,经常面临着"一系列相互 ...

  5. javascript 中的面向对象实现 如何封装

    javascript 是一门很灵活的语言,也是一门有缺陷的语言. 比如我们今天要谈的,如何用面向对象的手法来封装javascript ,javascript是没有类的概念的. 所以今天谈到的封装,其实 ...

  6. html5学习笔记---05.JavaScript 中的面向对象,继承和封装

    05.JavaScript 中的面向对象 a.创梦技术qq交流群:CreDream:251572072 a.JavaScript 是一种基于对象的语言   类:JavaScript 对象很抽象,所以下 ...

  7. Javascript中的单例和模块模式

    在javascript中,单例(singleton)就是指只有一个实例的对象,而不需要用new关键字去创建一个对象示例.单例其实有点类似于C# /C++里面的静态类.在javascript中,是以对象 ...

  8. 李建忠设计模式之“对象创建”模式

    文章目录 工厂方法模式(Factory Method) 定义 动机 结构图 代码 要点 总结 抽象工厂模式(Abstract Factory) 定义 动机 结构图 代码 要点 总结 原型模式(Prot ...

  9. JavaScript中的函数是对象?

    函数是第一类对象(first-class object),被称为一等公民.函数与对象共存,我们也可以认为函数就是其他任意类的对象. 那么今天,就让我们一起简单聊一聊JavaScript的函数吧! 目录 ...

  10. javascript中的面向对象理解(一)

    一.注意:提到"面向对象"这一概念,众所周知,javascript中的面向对象思想与其他的编程语言(例如:PHP.Java等)是有着很大区别的.因此,我们先复习下,传统意义上,面向 ...

最新文章

  1. Matlab与线性代数 -- 稀疏矩阵的创建
  2. 过程作为黑箱抽象——《计算机程序的构造和解释》
  3. Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理
  4. 关于写好文章的3个心法和5点技巧
  5. ubuntu 18.04 vi里面方向键变成abcd 处理办法
  6. “Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“解决方法
  7. SpringCloud集成Security安全(Config配置中心)
  8. Vivado设计流程(五)工程实现
  9. C# 利用ICSharpCode.SharpZipLib.dll 实现压缩和解压缩文件
  10. 范浩强treap——可持久化
  11. MathType批量修改公式字体和大小
  12. Shamir秘密共享算法
  13. 七夕节 看到很多停止更新的blog 莫名有点淡淡的忧桑
  14. Markdown 插入图片 基于base64编码
  15. 免费制作字体软件 - FontForge
  16. 创始人如何设置公司股权结构?
  17. 基于k210的水果分拣
  18. 九图鸡汤(从繁体中文翻译为简体中文)
  19. PPT 设置从第二页开始自动编号
  20. 三十六亿的《哪吒》历时五年,动画创作难如何解决?

热门文章

  1. Raspbian安装Opencv3
  2. BG.Hive - part1
  3. 浅谈PHP自动化代码审计技术
  4. C、C++ 宽字符WCString转为char*
  5. 用面向对象封装ASP中的cookie操作
  6. GridView 72般绝技
  7. AngularDart4.0 指南- 显示数据
  8. 在zabbix web上进行监控主机配置
  9. Dephi7程序设计与开发技术大全(求是科技)
  10. mysql添加索引造成的影响