更适用于JavaScript的设计模式:面向委托的设计,了解一下?(下)

先来看一下传统的面向类式的写法:

function Foo(name) {
    this.name = name;
}

Foo.prototype.sayName = function() {
    console.log(‘name: ‘ + this.name)
}

function Bar(name, age) {
    Foo.call(this, name);
    this.age = age;
}

Bar.prototype = Object.create(Foo.prototype);

Bar.prototype.sayAge = function() {
    console.log(‘age: ‘ + this.age)
}

var bar1 = new Bar(‘bar1‘, 13);

bar1.sayName();
bar1.sayAge();

这里的Object.create也可以替换成Object.setPrototypeOf,但是我们这里并不care它的constructor指向是否正确,所以从可读性的角度我们用Object.create。(why ? 请参考上一篇)

上面是传统的,也是最为推崇的寄生组合式继承模式,但是es6诞生以后,这种写法就不再流行了,更多的是利用class的语法糖,我们来看代码:

class Foo {
    constructor(name) {
        this.name = name;
    }
    sayName() {
        console.log(‘name: ‘ + this.name);
    }
}

class Bar extends Foo {
    constructor(name, age) {
        super(name);
        this.age = age;
    }
    sayAge() {
        console.log(‘age: ‘ + this.age);
    }
}

var bar3 = new Bar(‘bar3‘, 15);

bar3.sayName();
bar3.sayAge();

class的语法优势在于没有了prototype的混乱,很轻松地实现继承,利用super方法轻松实现构造函数的复制,等同于传统的call所实现的效果,extends实现委托机制,等同于Object.create所实现的效果。

但是缺陷在于加深了人们对于类以及继承的误解。

我们再来看利用委托的设计模式:

Foo = {
    init(name) {
        this.name = name
    },
    sayName() {
        console.log(‘name: ‘ + this.name);
    }
}

Bar = Object.create(Foo);

Bar.inits = function(name, age) {
    Foo.init.call(this, name);
    this.age = age;
}

Bar.sayAge = function() {
    console.log(‘age: ‘ + this.age);
}

var bar = Object.create(Bar);

bar.inits(‘bar‘, 14);

bar.sayName();
bar.sayAge();

同样,这里没有prototype的出现,也没有new构造函数调用,完全依靠委托的机制,完全是对象之间的联系。这种设计模式要求我们不再利用多态去重写原有的函数或属性,而是用不同的函数名或属性名消除这种歧义。

可能存在的缺陷是之前的new构造函数被分成了两段代码。

var bar = Object.create(Bar);

bar.inits(‘bar‘, 14);

但是有一个好处在于我们可以关注点分离,使得创建和初始化分离。

以上三种是目前主流的实现仿类以及继承的范式,第二种目前相对较为流行,第三种更生僻一些,但是却最符合JavaScript的设计思想,没有类的概念,没有构造函数,只有对象与对象的联系,行为委托。并不强求一定要用哪一种,还是看个人喜好吧,因为很难讲三者的优胜好坏。

end

原文地址:https://www.cnblogs.com/yanchenyu/p/10275601.html

时间: 2024-10-08 18:34:58

更适用于JavaScript的设计模式:面向委托的设计,了解一下?(下)的相关文章

深入理解javascript之设计模式

设计模式 设计模式是命名.抽象和识别对可重用的面向对象设计有用的的通用设计结构.设计模式确定类和他们的实体.他们的角色和协作.还有他们的责任分配. 每一个设计模式都聚焦于一个面向对象的设计难题或问题.它描述了在其它设计的约束下它能否使用,使用它后的后果和得失.因为我们必须最终实现我们的设计模式,所以每个设计模式都提供了例子,代码来对实现进行阐释. 虽然设计模式被描述为面向对象的设计,它们基于那些已经被主流面向对象语言实现过的解决方案...". 种类 设计模式可以被分成几个不同的种类.在这个部分我

Javascript中的事件委托机制

事件委托 事件委托,顾名思义,就是将本来要触发在A元素身上的事件,委托给B元素来触发,例如像onclick,onmouseover等事件都可以通过事件委托去触发. 事件委托实际上是通过事件冒泡的原理,将事件绑定在父元素或者祖先元素上,通过父元素或祖先元素触发相应的事件. 通过单纯的文字描述可能不太好理解,我们来通过代码去看看事件委托机制有哪些优点? 优点1-提高Javascript性能 使用事件委托机制绑定事件,可以减少内存的占用,从而提高事件处理速度.我们通过具体的实例来进行讲解. 我们要完成

游戏设计模式——面向数据编程(新)

目录 面向数据编程是什么? 单指令流多数据流(SIMD) 什么是SIMD 为什么需要SIMD 支持SIMD技术的指令集 使用SIMD编程 使用汇编内联 使用指令集库 使用ISPC语言 并行循环 避免Gather行为 CPU缓存(CPU cache) 什么是CPU缓存 为什么需要CPU缓存 CPU缓存预先存的是什么 CPU缓存命中/未命中 提高CPU缓存命中率 使用连续数组存储要批处理的对象 避免无效数据夹杂在连续内存区域 冷数据/热数据分割 频繁调用的函数尽可能不要做成虚函数 重新认识C++ S

iOS.常用设计模式.02.委托模式

WTDelegate #import <Foundation/Foundation.h> @protocol WTDelegate <NSObject> @required - (void)sleep; - (void)eat; - (void)work; @end WTPhilosopher.h #import <Foundation/Foundation.h> #import "WTDelegate.h" @interface WTPhiloso

JavaScript匿名函数与委托

<1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <!-- C#匿名函数--> <title></title> <script type="text/javascript"> var f1 = function (x, y) { //[1] 定义一个匿名函数,用变量f1来指向它(f1相当于一个委托,这个时候f1就可以当做一个

JavaScript事件设计模式

本文章参考自:<征服Ajax Web 2.0 开发技术详解>为了自己日后查阅并与大家共享. 1. 事件设计概述 事件机制可以是程序逻辑更加清晰可见,在JavaScript中很多对象都有自己的事件,如:button有onclick事件,selcet有onchange事件.对于我们自己设计的类,是否也可以有事件机制呢?答案是肯定的.我们可以通过事件机制,将类设计为独立的模块,从而使其可以通过事件与外通信,提高程序的开发效率. 2. 不带参数的事件设计模式 最简单的一种模式是将一个类的方法成员定义为

设计模式中的六大设计原则之一,二

最近在学习设计模式方面的知识,首先接触到的是设计模式中的六大设计原则: 1.单一职责原则: 2.里氏替换原则:3.依赖倒置原则:4.接口隔离原则:5.迪米特法则:开闭原则.下面我来讲讲我对这六大设计自己的理解,如有欠缺地地方,请大家及时指出啊...   1.单一职责原则:应该有且仅有一个原因引起类的变更.通俗的说,即一个类只负责一项职责.下面我们举一个具体的例子来说明一下什么是单一职责原则.电话通话的时候有4个过程发生:拨号,通话,回应,挂机,首先看下面这样一个借口,如图1所示: 图1. 我们来

设计模式中的一些设计原则

七大著名设计原则 1.单一职责原则(SRP - Single Responsibility Principle) 就一个类而言,应该仅有一个引起它变化的原因,功能要单一 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏 软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离,如果你能够想到多于一个的动机去改变一个类,那么这个类就具备有多于一个的职责 2.开放-封

设计模式之6大设计原则

设计模式之6大设计原则 原则一:单一职责原则(Single Responsibility Principle SRP) 定义:There should never be more than one reason for a class to change.(应该有且仅有一个原因引起类的变更) 好处: 1.类的复杂性降低,实现什么职都有清晰明确的定义: 2.可读性高,负责性降低,当然可读性就提高了: 3.可维护性提高,可读性提高,自然就更容易维护了: 4.变更引起的风险降低,变更是必不可少的,如果