JS设计模式 -原型模式与构造函数
2017-11-28 22:43
288 查看
JS设计模式 - 原型模式与构造函数模式
1. 原型模式
原型模式称为基于现有对象的模板通过克隆来创建对象的模式。我们可以将原型模式视为基于原型继承,在原型继承中我们创建对象作为其他对象的原型。原型对象本身被有效地用作构造函数创建的每个对象的蓝图。
ECMAScript 5标准中定义的真正的原型继承,需要使用Object.create。为了提醒自己,Object.create创建一个具有指定原型的对象,并且还可以包含指定的属性(例如Object.create( prototype, optionalDescriptorObjects ))。
var myCar = { name: "Ford Escort", drive: function () { console.log( "Weeee. I'm driving!" ); }, panic: function () { console.log( "Wait. How do you stop this thing?" ); } }; // Use Object.create to instantiate a new car var yourCar = Object.create( myCar ); // Now we can see that one is a prototype of the other console.log( yourCar.name );
Object.create也使我们能够轻松实现高级概念,如差异继承,其中对象能够直接从其他对象继承。我们之前看到,Object.create允许我们使用第二个提供的参数初始化对象属性。例如:
var vehicle = { getModel: function () { console.log( "The model of this vehicle is.." + this.model ); } }; var car = Object.create(vehicle, { "id": { value: MY_GLOBAL.nextId(), // writable:false, configurable:false by default enumerable: true }, "model": { value: "Ford", enumerable: true } });
如果我们希望不直接使用原型模式Object.create,我们可以按照上面的例子模拟模式如下:
var vehiclePrototype = { init: function ( carModel ) { this.model = carModel; }, getModel: function () { console.log( "The model of this vehicle is.." + this.model); } }; function vehicle( model ) { function F() {}; F.prototype = vehiclePrototype; var f = new F(); f.init( model ); return f; } var car = vehicle( "Ford Escort" ); car.getModel();
Prototype模式的最后一种替代实现可能如下:
var beget = (function () { function F() {} return function ( proto ) { F.prototype = proto; return new F(); }; })();
2. 原型模式与构造函数模式
构造函数的相关内容请查看 JS原型模式与构造函数模式
上图中构造函数模式的两种属性,实例属性与共有属性,因为构造函数模式如果没有使用prototype方式的话,我们只能叫做这两个名字,所以为了兼容不适用prototype的方式,这里暂且叫做这两个和名字。至于原型模式的话就是自有属性与从原型链上继承而来的属性。
首
4000
先二者的创建对象的方式不同,原型模式必须拥有prototype的存在,而构造函数方式不必依赖prototype。
第二的是谈一下自己对于二者之间的一些理解吧。就好像在日常开发中这个team中有许多的成员,内部也会有小组。所有的成员相对于team来讲的话,那就是构造函数模式,这里team并不是指某一个个体,而是相当于一个function,我们所有的成员因为这个team工作在一起。在日常开发中,team对于我们的限制其实不大,只有当我们面向整个冻死的时候,才会提到我们的共有属性,某一个team。大部分的时间我们还是坐着自己的事情(实例属性)。
然后我上面有一个leader,我们两个一组,现在这个leader,我就是相当于原型模式,现在这个原型对象就是leader,我在这个组里工作就一定会有一些leader定义的工作方式(继承属性),当然也有一些自己处理问题的方式(自有属性)
这个例子可能不太恰当,更多的理解我认为二者的侧重点不同,尽管看起来没有什么区别。构造函数模式侧重于处理多个对象,只是想要说明这些对象一些共同点,但是不会对于个体有很多的限制。原型模式的侧重点应该是处理较少的对象,需要原型对象与实例对象的紧密联系,会对实例对象有着较多的限制。
note: 不管对于构造函数模式的共有属性,还是原型对象的继承属性,实例对象都是可以重写的。
相关文章推荐
- js创建对象的构造函数模式+原型模式和组合继承\Hybrid Pattern & combination inheritance
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- js类 混合的构造函数/原型模式
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
- JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习
- 浅议javascript的工厂模式,构造函数模式及原型模式
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- 举个构造函数和原型模式组合使用定义用户类型的例子,
- 定义JavaScript类:工厂模式、构造函数模式、原型模式、构造函数原型模式、动态原型模式
- JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承
- javascript 面向对象编程(工厂模式、构造函数模式、原型模式)
- JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)
- Js面向对象漫谈(1) 工厂模式,构造函数模式,原型模式
- Javascript--工厂模式、构造函数、原型
- 在立即执行函数内组合使用构造函数模式和原型模式创建对象,实现模块化开发(以daterangepicker.js为例)
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- 创建对象-组合使用构造函数和原型模式
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
- js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
- javascript面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)