JavaScript中的面向对象(1):对象创建模式
对象
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):对象创建模式相关推荐
- 如何理解并学习javascript中的面向对象(OOP)
本文不适合javascript初学者看(javascript水平还停留在函数级别的朋友,看了会觉得很晕的).如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的 ...
- Singleton(单件)--对象创建模式
Singleton(单件)–对象创建模式 一.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 二.动机 1.在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能 ...
- Prototype(原型)--对象创建模式
Prototype(原型)–对象创建模式 一.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.动机 1.在软件系统中,经常面临着"某些结构复杂的对象"的 ...
- Abstract Factory(抽象工厂)--对象创建模式
Abstract Factory (抽象工厂)–对象创建模式 一.意图 提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类. 二.动机 1.在软件系统中,经常面临着"一系列相互 ...
- javascript 中的面向对象实现 如何封装
javascript 是一门很灵活的语言,也是一门有缺陷的语言. 比如我们今天要谈的,如何用面向对象的手法来封装javascript ,javascript是没有类的概念的. 所以今天谈到的封装,其实 ...
- html5学习笔记---05.JavaScript 中的面向对象,继承和封装
05.JavaScript 中的面向对象 a.创梦技术qq交流群:CreDream:251572072 a.JavaScript 是一种基于对象的语言 类:JavaScript 对象很抽象,所以下 ...
- Javascript中的单例和模块模式
在javascript中,单例(singleton)就是指只有一个实例的对象,而不需要用new关键字去创建一个对象示例.单例其实有点类似于C# /C++里面的静态类.在javascript中,是以对象 ...
- 李建忠设计模式之“对象创建”模式
文章目录 工厂方法模式(Factory Method) 定义 动机 结构图 代码 要点 总结 抽象工厂模式(Abstract Factory) 定义 动机 结构图 代码 要点 总结 原型模式(Prot ...
- JavaScript中的函数是对象?
函数是第一类对象(first-class object),被称为一等公民.函数与对象共存,我们也可以认为函数就是其他任意类的对象. 那么今天,就让我们一起简单聊一聊JavaScript的函数吧! 目录 ...
- javascript中的面向对象理解(一)
一.注意:提到"面向对象"这一概念,众所周知,javascript中的面向对象思想与其他的编程语言(例如:PHP.Java等)是有着很大区别的.因此,我们先复习下,传统意义上,面向 ...
最新文章
- Matlab与线性代数 -- 稀疏矩阵的创建
- 过程作为黑箱抽象——《计算机程序的构造和解释》
- Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理
- 关于写好文章的3个心法和5点技巧
- ubuntu 18.04 vi里面方向键变成abcd 处理办法
- “Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“解决方法
- SpringCloud集成Security安全(Config配置中心)
- Vivado设计流程(五)工程实现
- C# 利用ICSharpCode.SharpZipLib.dll 实现压缩和解压缩文件
- 范浩强treap——可持久化
- MathType批量修改公式字体和大小
- Shamir秘密共享算法
- 七夕节 看到很多停止更新的blog 莫名有点淡淡的忧桑
- Markdown 插入图片 基于base64编码
- 免费制作字体软件 - FontForge
- 创始人如何设置公司股权结构?
- 基于k210的水果分拣
- 九图鸡汤(从繁体中文翻译为简体中文)
- PPT 设置从第二页开始自动编号
- 三十六亿的《哪吒》历时五年,动画创作难如何解决?