本章深挖原型机制。

[[Prototype]]比类更直接和简单!

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch6.md

这个实际的机制,都是关于对象之间的连接,一个对象被连接到其他对象上!


Towards Delegation-Oriented Design

行为授权的设计模式。OLOO模式。

Class Theory(略)

Delegation Theory

首先,定义一个对象叫做Task, 它将有具体的行为,包括诸多utility methods可以让各类tasks使用(delegatet to)。

然后,轮到每个task("ABC","XYZ"), 你定义一个对象来持有task-specific data/behavior。你连接你的task-specific对象到Task utility对象, 通过授权让它们可以使用它(Task utility对象)。

例子:

var Task = {
setID: function(ID) { this.id = ID; },
outputID: function() { console.log( this.id ); }
}; // make `XYZ` delegate to `Task`
var XYZ = Object.create( Task ); XYZ.prepareTask = function(ID,Label) {
this.setID( ID );
this.label = Label;
}; XYZ.outputTaskDetails = function() {
this.outputID();
console.log( this.label );
};

1. Task, XYZ是纯对象,不是函数(类)。

2. XYZ是通过Object.create(..)建立的,并通过原型机制得到Task对象的授权Delegate!

这种模式可以成为objects-linked-to-other-objects, OLOO

⚠️

1.类的设计模式,可以在子类重写父类的方法,使用相同的方法名字。但OLOO模式正相反,避免在原型链上出现相同的name.(就是shadowing,第五章讲过,如果出现的话,有比较复杂的判断模式)

2.this.setID(ID); 首先在XYZ上寻找setID(..), 没有,顺着原型链向上找。

3. 无需使用new关键字,创建构建器函数,无需使用prototype方法。

Behavior Delegation模式无需父类子类,继承,多态等概念。

⚠️:Delegation更适合用在内部的使用,而不建议直接使用: XYZ.setID(ID).  而是通过使用prepareTask这个XYZ自己的方法,调用原型链条上的函数。

Mutual Delegation (Disallowed)

一个对象不能被多个对象授权,这样容易造成♻️。禁止。

Debugged

我们一般使用chrome Developer Tools进行debug。

但注意浏览器工具如firefox之间的代码输出不同:

function Foo() {}

var a1 = new Foo();

a1; // Foo {}  这是用chrome, {} 是一个空对象,由Foo函数构建。
a1; // Object {} 这是用火狐, {}是一个空对象,从Object构建

细微的区别是Chrome是主动追踪的, 作为一个内部的property特性, 这个实际函数的名字制造了这个构建,而其他浏览器不追踪这个增加的信息!

Chrome的这个功能:内部的constructor name追踪在你完全拥抱Class-style时很有用,但如果你拥抱OLOO则没有用


Mental Models Compared(复杂的结构图)

2张图,2块代码(用class-style, 和OLOO)

Class-style

function Foo(who) {
this.me = who;
}
Foo.prototype.identify = function() {
return "I am " + this.me;
}; function Bar(who) {
Foo.call( this, who );
}
Bar.prototype = Object.create( Foo.prototype ); Bar.prototype.speak = function() {
alert( "Hello, " + this.identify() + "." );
}; var b1 = new Bar( "b1" );
var b2 = new Bar( "b2" ); b1.speak();
b2.speak();

object-link-to-another-object

var Foo = {
init: function(who) {
this.me = who;
},
identify: function() {
return "I am " + this.me;
}
}; var Bar = Object.create( Foo ); Bar.speak = function() {
alert( "Hello, " + this.identify() + "." );
}; var b1 = Object.create( Bar );
b1.init( "b1" );
var b2 = Object.create( Bar );
b2.init( "b2" ); b1.speak();
b2.speak();

oloo模式,无需classes, constructors, prototypes, new的调用!


后面的暂时不看了,这是用纯javascript设计网页的交互行为。!!!

Classes vs. Objects

上面是不同的理论探索,和模型:classes vs behavior delegation.

现在看看更多的细节。

前端的设计:创建UI widgets(buttons, drop-downs)

Widget "Classes"

ES6 class sugar

Delegating Widget Objects


Simpler Design

De-class-ified

Nicer Syntax

Unlexical


Introspection反省(查询)


Review (TL;DR)

You Don't Know JS: this & Object Prototypes (第6章 Behavior Delegation)附加的ES6 class未读的更多相关文章

  1. You Don't Know JS: this & Object Prototypes( 第4章 Mixing "Class" Objects)

    本章移到“Object oriented programming”和"classes". 看‘class orientation‘ 的设计模式: instantiation, in ...

  2. You Don't Know JS: this & Object Prototypes( 第5章 Prototypes)

    qu上章提到过[[prototype]] chain, 本章详细分析 ⚠️所有试图模仿类复制的行为,如上章提到的mixins的变种,完全规避了[[Prototype]] chain机制,本章会谈到这方 ...

  3. You Don't Know JS: this & Object Prototypes( 第2章 this)

    this is a binding made for each function invocation, based entirely on its call-site (how the functi ...

  4. You Don't Know JS: this & Object Prototypes( 第3章 对象)

    前2章探索了this绑定指向不同的对象需要函数引用的call-site. 但是什么是对象,为什么我们需要指向它们? 本章探索细节. Syntax the rules  that describe ho ...

  5. You Don't Know JS: this & Object Prototypes( 第一章 this or That?)

    Foreword this 关键字和prototypes 他们是用JS编程的基础.没有他们创建复杂的JS程序是不可能的. 我敢说大量的web developers从没有建立过JS Object,仅仅对 ...

  6. JS的Object漫想:从现象到“本质”

    转自:http://zzy603.iteye.com/blog/973649 写的挺好,用于记录,把对象分成概念的Object(var f={})和 类的Object(function F(){}) ...

  7. Javascript中Function,Object,Prototypes,__proto__等概念详解

    http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89% ...

  8. js中Object.defineProperty()和defineProperties()

    在介绍js中Object.defineProperty()和defineProperties()之前,我们了解下js中对象两种属性的类型:数据属性和访问器属性. 数据属性 数据属性包含一个数据的位置, ...

  9. js 之 object

    js之object 对象 ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScrip ...

随机推荐

  1. 向eclipse的JavaWeb项目中导入jar包

    一:      在你所需的jar包网站下载对应的jar包.如org.apache.commons.lang.jar. 二:复制粘贴到该JavaWeb的WEB-INF目录下的lib目录下,如: 三:右键 ...

  2. freeswitch 获取app和api帮助

    通过show显示帮助命令 输出xml格式:show calls as xml 输出json格式 列出所有:show codec 解释: codec - 列出所有编码 endpoint - 列出所有en ...

  3. C# 文件与二进制之间的转换

    /// <summary> /// 工具类:文件与二进制流间的转换 /// </summary> public class FileBinaryConvertHelper { ...

  4. Vue学习【第二篇】:ES6简单介绍

    ECMAScript 6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript ...

  5. 振兴中华|2013年蓝桥杯A组题解析第三题-fishers

    标题: 振兴中华 小明参加了学校的趣味运动会,其中的一个项目是:跳格子. 地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg) 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛 ...

  6. SPOJ 687 REPEATS - Repeats

    题意 给定字符串,求重复次数最多的连续重复子串 思路 后缀数组的神题 让我对着题解想了快1天 首先考虑一个暴力,枚举循环串的长度l,然后再枚举每个点i,用i和i+l匹配,如果匹配长度是L,这个循环串就 ...

  7. 【ASP.NET】System.Web.Routing - StopRoutingHandler Class

    Provides a way to specify that ASP.NET routing should not handle requests for a URL pattern. ex: rou ...

  8. word设置行距18磅

    参考:word如何设置行距18磅 word设置行距18磅 选中需要设置的段落--"格式"菜单--段落--"缩进和间距"标签--在"行距"下拉 ...

  9. Linux命令之du命令

    du命令 显示文件或目录所占用的磁盘空间. 命令格式: du [option] 文件/目录 -h 输出文件系统分区使用的情况,例如:10KB,10MB,10GB等 -s 显示文件或整个目录的大小,默认 ...

  10. Linux 服务器 安装 goflyway

    github官方开发主页:https://github.com/coyove/goflyway goflyway的用途就不说了,你能搜到此文章就说明已经知道了. centos和Ubuntu均可使用,其 ...